ntru 0.5.6

Implementation of the NTRUEncrypt algorithm. Interface to libntru.
CC?=gcc
AS=$(CC) -c
OPTFLAGS=-O2
bench: OPTFLAGS=-O3
CFLAGS=-g -Wall -Wextra -Wno-unused-parameter $(OPTFLAGS)
SSSE3_FLAG = $(shell /usr/sbin/sysctl machdep.cpu.features | grep -m 1 -ow SSSE3)
ifneq ($(SSE), no)
    ifeq ($(SSSE3_FLAG), SSSE3)
        SSE=yes
    endif
endif
AVX2_FLAG = $(shell /usr/sbin/sysctl machdep.cpu.features | grep -m 1 -ow AVX2)
ifneq ($(AVX2), no)
    ifeq ($(AVX2_FLAG), AVX2)
        AVX2=yes
    endif
endif
ifeq ($(AVX2), yes)
    SSE=yes
endif
ifeq ($(SSE), no)
    AVX2=no
endif
ifeq ($(SSE), yes)
    CFLAGS+=-mssse3
endif
ifeq ($(SSE), no)
    CFLAGS+=-march=x86-64
endif
ifeq ($(AVX2), yes)
    CFLAGS+=-mavx2
endif
SRCDIR=src
TESTDIR=tests
LIB_OBJS=bitstring.o encparams.o hash.o idxgen.o key.o mgf.o ntru.o poly.o rand.o arith.o sha1.o sha2.o nist_ctr_drbg.o rijndael.o
ifeq ($(SSE), yes)
    LIB_OBJS+=sha1-mb-x86_64.o sha256-mb-x86_64.o
endif
TEST_OBJS=test_bitstring.o test_hash.o test_idxgen.o test_key.o test_ntru.o test.o test_poly.o test_util.o
VERSION=0.5
INST_PFX=/usr
INST_LIBDIR=$(INST_PFX)/lib
INST_INCLUDE=$(INST_PFX)/include/libntru
INST_DOCDIR=$(INST_PFX)/share/doc/libntru
INST_HEADERS=ntru.h types.h key.h encparams.h hash.h rand.h err.h
PERL=/usr/bin/perl
PERLASM_SCHEME=macosx

LIB_OBJS_PATHS=$(patsubst %,$(SRCDIR)/%,$(LIB_OBJS))
TEST_OBJS_PATHS=$(patsubst %,$(TESTDIR)/%,$(TEST_OBJS))
DIST_NAME=libntru-$(VERSION)
MAKEFILENAME=$(lastword $(MAKEFILE_LIST))

.PHONY: all lib install uninstall dist test clean distclean

all: lib

lib: $(LIB_OBJS_PATHS)
	$(CC) $(CFLAGS) $(CPPFLAGS) -dynamiclib -o libntru.dylib $(LIB_OBJS_PATHS) $(LDFLAGS) $(LIBS)

install: lib
	test -d "$(DESTDIR)$(INST_PFX)" || mkdir -p "$(DESTDIR)$(INST_PFX)"
	test -d "$(DESTDIR)$(INST_LIBDIR)" || mkdir "$(DESTDIR)$(INST_LIBDIR)"
	test -d "$(DESTDIR)$(INST_INCLUDE)" || mkdir -p "$(DESTDIR)$(INST_INCLUDE)"
	test -d "$(DESTDIR)$(INST_DOCDIR)" || mkdir -p "$(DESTDIR)$(INST_DOCDIR)"
	install -m 0755 libntru.so "$(DESTDIR)$(INST_LIBDIR)/libntru.so"
	install -m 0644 README.md "$(DESTDIR)$(INST_DOCDIR)/README.md"
	for header in $(INST_HEADERS) ; do \
	    install -m 0644 "$(SRCDIR)/$$header" "$(DESTDIR)$(INST_INCLUDE)/" ; \
	done

uninstall:
	rm -f "$(DESTDIR)$(INST_LIBDIR)/libntru.so"
	rm -f "$(DESTDIR)$(INST_DOCDIR)/README.md"
	rmdir "$(DESTDIR)$(INST_DOCDIR)/"
	for header in $(INST_HEADERS) ; do \
	    rm "$(DESTDIR)$(INST_INCLUDE)/$$header" ; \
	done
	rmdir "$(DESTDIR)$(INST_INCLUDE)/"

dist:
	rm -rf $(DIST_NAME)
	mkdir $(DIST_NAME)
	mkdir $(DIST_NAME)/$(SRCDIR)
	mkdir $(DIST_NAME)/$(TESTDIR)
	cp Makefile Makefile.win Makefile.osx README.md LICENSE PATENTS $(DIST_NAME)
	cp $(SRCDIR)/*.c $(DIST_NAME)/$(SRCDIR)
	cp $(SRCDIR)/*.h $(DIST_NAME)/$(SRCDIR)
	cp $(TESTDIR)/*.c $(DIST_NAME)/$(TESTDIR)
	cp $(TESTDIR)/*.h $(DIST_NAME)/$(TESTDIR)
	tar cf $(DIST_NAME).tar.xz $(DIST_NAME) --lzma
	rm -rf $(DIST_NAME)

test:
	$(MAKE) -f $(MAKEFILENAME) testnoham
	@echo
	@echo Testing patent-reduced build
	DYLD_LIBRARY_PATH=. ./testnoham
	$(MAKE) -f $(MAKEFILENAME) testham
	@echo
	@echo Testing full build
	DYLD_LIBRARY_PATH=. ./testham

testham: clean lib $(TEST_OBJS_PATHS)
	@echo CFLAGS=$(CFLAGS)
	$(CC) $(CFLAGS) -o testham $(TEST_OBJS_PATHS) -L. -lntru -lm

testnoham: CFLAGS += -DNTRU_AVOID_HAMMING_WT_PATENT
testnoham: clean lib $(TEST_OBJS_PATHS)
	@echo CFLAGS=$(CFLAGS)
	$(CC) $(CFLAGS) -o testnoham $(TEST_OBJS_PATHS) -L. -lntru -lm

bench: lib
	$(CC) $(CFLAGS) $(CPPFLAGS) -o bench $(SRCDIR)/bench.c $(LDFLAGS) -L. -lntru

hybrid: lib
	$(CC) $(CFLAGS) $(CPPFLAGS) -o hybrid $(SRCDIR)/hybrid.c $(LDFLAGS) -L. -lntru -lcrypto

$(SRCDIR)/%.o: $(SRCDIR)/%.c
	$(CC) $(CFLAGS) $(CPPFLAGS) -c -fPIC $< -o $@

$(SRCDIR)/sha1-mb-x86_64.s: $(SRCDIR)/sha1-mb-x86_64.pl; CC=$(CC) ASM="$(AS)" $(PERL) $(SRCDIR)/sha1-mb-x86_64.pl $(PERLASM_SCHEME) > $@
$(SRCDIR)/sha1-mb-x86_64.o: $(SRCDIR)/sha1-mb-x86_64.s
	$(AS) $(SRCDIR)/sha1-mb-x86_64.s -o $@
$(SRCDIR)/sha256-mb-x86_64.s: $(SRCDIR)/sha256-mb-x86_64.pl; CC=$(CC) ASM="$(AS)" $(PERL) $(SRCDIR)/sha256-mb-x86_64.pl $(PERLASM_SCHEME) > $@
$(SRCDIR)/sha256-mb-x86_64.o: $(SRCDIR)/sha256-mb-x86_64.s
	$(AS) $(SRCDIR)/sha256-mb-x86_64.s -o $@

tests/%.o: tests/%.c
	$(CC) $(CFLAGS) $(CPPFLAGS) -fPIC -I$(SRCDIR) -c $< -o $@

clean:
	@# also clean files generated on other OSes
	rm -f $(SRCDIR)/*.o $(SRCDIR)/*.s $(TESTDIR)/*.o libntru.so libntru.a libntru.dylib libntru.dll testham testnoham testham.exe testnoham.exe bench bench.exe hybrid hybrid.exe

distclean: clean
	rm -rf $(DIST_NAME)
	rm -f $(DIST_NAME).tar.xz $(DIST_NAME).zip