CC=g++

# For MinGW32
#CFLAGS=-O2 -Wno-deprecated
CFLAGS=-O2

AR=ar

ARFLAGS=ruv

RANLIB=ranlib

LDFLAGS=

LDLIBS=-lm
NTL_LIBS=-lntl

PREFIX=/usr/local
# Uncomment the following line if you're using MinGW for Windows
#PREFIX=/mingw
LIBDIR=$(PREFIX)/lib
INCLUDEDIR=$(PREFIX)/include
DOCDIR=$(PREFIX)/doc

OBJ=ecc.o
SRC=ecc.c
INCL=ecc.h

ECC_INCLUDE=-I../include
COMPILE=$(CC) $(ECC_INCLUDE) $(CFLAGS) -c
LINK=$(CC) $(ECC_INCLUDE) $(CFLAGS) $(LDFLAGS)

# For MinGW
#TEST_FLAGS=-lntl -lecc -Wno-deprecated
TEST_FLAGS=-lntl -lecc 
ECC_CURVES=../curves
TEST=../test

all:	ecc.a

ecc.o:	$(SRC)
	$(COMPILE) $(SRC)

ecc.a:	$(OBJ)
	$(AR) $(ARFLAGS) ecc.a $(OBJ)
	- $(RANLIB) ecc.a

install:
	mkdir -p $(LIBDIR)
	cp ecc.a $(LIBDIR)/libecc.a
	mkdir -p $(INCLUDEDIR)
	mkdir -p $(INCLUDEDIR)/ECC
	cp ../include/*.h $(INCLUDEDIR)/ECC
	mkdir -p $(DOCDIR)
	- rm -r $(DOCDIR)/ECC
	mkdir $(DOCDIR)/ECC
	cp ../doc/* $(DOCDIR)/ECC

uninstall:
	- rm $(LIBDIR)/libecc.a
	- rm -r $(INCLUDEDIR)/ECC
	- rm -r $(DOCDIR)/ECC

clean:
	- rm *.o
	- rm *.a
	- rm test1 keypairgen siggen verify crypt decrypt
# For MinGW32
#	- rm *.exe   

test1:	test1.c
	$(CC) -o test1 test1.c $(TEST_FLAGS)

test2:	test2.c
	$(CC) -o test2 test2.c $(TEST_FLAGS)

keypairgen:	keypairgen.c
	$(CC) -o keypairgen keypairgen.c $(TEST_FLAGS)

crypt:	crypt.c
	$(CC) -o crypt crypt.c $(TEST_FLAGS)

decrypt:decrypt.c
	$(CC) -o decrypt decrypt.c $(TEST_FLAGS)

siggen:	siggen.c
	$(CC) -o siggen siggen.c $(TEST_FLAGS)

verify: verify.c
	$(CC) -o verify verify.c $(TEST_FLAGS)

test:	test1 keypairgen siggen verify crypt decrypt
	echo ; echo "Testing curve K-163..."
	cat $(ECC_CURVES)/K-163 | ./test1
	echo ; echo "Testing curve K-233..."
	cat $(ECC_CURVES)/K-233 | ./test1
	echo ; echo "Testing curve K-283..."
	cat $(ECC_CURVES)/K-283 | ./test1
	echo ; echo "Testing curve K-409..."
	cat $(ECC_CURVES)/K-409 | ./test1
	echo ; echo "Testing curve K-571..."
	cat $(ECC_CURVES)/K-571 | ./test1
	echo ; echo "Testing curve B-163..."
	cat $(ECC_CURVES)/B-163 | ./test1
	echo ; echo "Testing curve B-233..."
	cat $(ECC_CURVES)/B-233 | ./test1
	echo ; echo "Testing curve B-283..."
	cat $(ECC_CURVES)/B-283 | ./test1
	echo ; echo "Testing curve B-409..."
	cat $(ECC_CURVES)/B-409 | ./test1
	echo ; echo "Testing curve B-571..."
	cat $(ECC_CURVES)/B-571 | ./test1
	echo ; echo "Testing key pair generation..."
	cat $(ECC_CURVES)/K-571 | ./keypairgen
	echo ; echo "Testing encryption..."
	cat $(ECC_CURVES)/K-163 $(TEST)/jmgarcia.pub $(TEST)/data.hex | ./crypt | tee $(TEST)/data.enc
	echo ; echo "Testing decryption..."
	cat $(ECC_CURVES)/K-163 $(TEST)/jmgarcia $(TEST)/data.enc | ./decrypt
	echo ; echo "Testing signature generation..."
	cat $(ECC_CURVES)/K-163 $(TEST)/jmgarcia $(TEST)/data | ./siggen | tee $(TEST)/data.sig
	echo ; echo "Testing signature verification..."
	cat $(ECC_CURVES)/K-163 $(TEST)/jmgarcia.pub $(TEST)/data $(TEST)/data.sig | ./verify
	cat $(ECC_CURVES)/K-163 $(TEST)/jmgarcia.pub $(TEST)/data-fake $(TEST)/data.sig | ./verify

benchmark: test2
	echo ; echo "Testing curve K-163..."
	cat $(ECC_CURVES)/K-163 | ./test2
	echo ; echo "Testing curve K-233..."
	cat $(ECC_CURVES)/K-233 | ./test2
	echo ; echo "Testing curve K-283..."
	cat $(ECC_CURVES)/K-283 | ./test2
	echo ; echo "Testing curve K-409..."
	cat $(ECC_CURVES)/K-409 | ./test2
	echo ; echo "Testing curve K-571..."
	cat $(ECC_CURVES)/K-571 | ./test2
	echo ; echo "Testing curve B-163..."
	cat $(ECC_CURVES)/B-163 | ./test2
	echo ; echo "Testing curve B-233..."
	cat $(ECC_CURVES)/B-233 | ./test2
	echo ; echo "Testing curve B-283..."
	cat $(ECC_CURVES)/B-283 | ./test2
	echo ; echo "Testing curve B-409..."
	cat $(ECC_CURVES)/B-409 | ./test2
	echo ; echo "Testing curve B-571..."
	cat $(ECC_CURVES)/B-571 | ./test2
