--- /dev/null
+CC?=cc
+AS=$(CC) -c
+AR?=ar
+
+CFLAGS?=-g
+CFLAGS+=-Wall -Wextra -Wno-unused-parameter -g
+SSSE3_FLAG = $(shell /usr/bin/grep -o SSSE3 /var/run/dmesg.boot | /usr/bin/head -1)
+ifneq ($(SSE), no)
+ ifeq ($(SSSE3_FLAG), SSSE3)
+ SSE=yes
+ endif
+endif
+AVX2_FLAG = $(shell /usr/bin/grep -o AVX2 /var/run/dmesg.boot | /usr/bin/head -1)
+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 ($(AVX2), yes)
+ CFLAGS+=-mavx2
+endif
+
+# use -march=native if we're compiling for x86
+BENCH_ARCH_OPTION=
+MACHINE=$(shell uname -m | sed 's/i.86/i386/g')
+ifeq ($(SSE), yes)
+ ifeq ($(MACHINE), i386)
+ BENCH_ARCH_OPTION=-march=native
+ endif
+ ifeq ($(MACHINE), amd64)
+ BENCH_ARCH_OPTION=-march=native
+ endif
+endif
+OPTFLAGS=-O2
+bench: OPTFLAGS=-O3 $(BENCH_ARCH_OPTION)
+CFLAGS+=$(OPTFLAGS)
+
+ifneq ($(shell uname), OpenBSD)
+ LIBS+=-lrt
+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)
+ ifeq ($(MACHINE), amd64)
+ LIB_OBJS+=sha1-mb-x86_64.o sha256-mb-x86_64.o
+ endif
+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-$(VERSION)
+INST_HEADERS=ntru.h types.h key.h encparams.h hash.h rand.h err.h
+PERL=/usr/local/bin/perl
+PERLASM_SCHEME=elf
+
+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: libntru.so
+
+static-lib: libntru.a
+
+libntru.so: $(LIB_OBJS_PATHS)
+ $(CC) $(CFLAGS) $(CPPFLAGS) -shared -Wl,-soname,libntru.so -o libntru.so $(LIB_OBJS_PATHS) $(LDFLAGS) $(LIBS)
+
+libntru.a: $(LIB_OBJS_PATHS)
+ $(AR) cru libntru.a $(LIB_OBJS_PATHS)
+
+install: install-lib install-doc install-headers
+
+install-lib: lib
+ test -d "$(DESTDIR)$(INST_LIBDIR)" || mkdir -p "$(DESTDIR)$(INST_LIBDIR)"
+ install -m 0755 libntru.so "$(DESTDIR)$(INST_LIBDIR)/libntru.so"
+
+install-static-lib: static-lib
+ test -d "$(DESTDIR)$(INST_LIBDIR)" || mkdir -p "$(DESTDIR)$(INST_LIBDIR)"
+ install -m 0755 libntru.a "$(DESTDIR)$(INST_LIBDIR)/libntru.a"
+
+install-doc:
+ test -d "$(DESTDIR)$(INST_DOCDIR)" || mkdir -p "$(DESTDIR)$(INST_DOCDIR)"
+ install -m 0644 README.md "$(DESTDIR)$(INST_DOCDIR)/README.md"
+
+install-headers:
+ test -d "$(DESTDIR)$(INST_INCLUDE)" || mkdir -p "$(DESTDIR)$(INST_INCLUDE)"
+ for header in $(INST_HEADERS) ; do \
+ install -m 0644 "$(SRCDIR)/$$header" "$(DESTDIR)$(INST_INCLUDE)/" ; \
+ done
+
+uninstall: uninstall-lib uninstall-doc uninstall-headers
+
+uninstall-lib:
+ rm -f "$(DESTDIR)$(INST_LIBDIR)/libntru.so"
+
+uninstall-static-lib:
+ rm -f "$(DESTDIR)$(INST_LIBDIR)/libntru.a"
+
+uninstall-doc:
+ rm -f "$(DESTDIR)$(INST_DOCDIR)/README.md"
+ rmdir "$(DESTDIR)$(INST_DOCDIR)/"
+
+uninstall-headers:
+ 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
+ LD_LIBRARY_PATH=. ./testnoham
+ $(MAKE) -f $(MAKEFILENAME) testham
+ @echo
+ @echo Testing full build
+ LD_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: static-lib
+ $(CC) $(CFLAGS) $(CPPFLAGS) -o bench $(SRCDIR)/bench.c $(LDFLAGS) $(LIBS) -L. -lntru
+
+hybrid: static-lib
+ $(CC) $(CFLAGS) $(CPPFLAGS) -o hybrid $(SRCDIR)/hybrid.c $(LDFLAGS) $(LIBS) -L. -lntru -lcrypto
+
+hybrid-rev: static-lib
+ $(CC) $(CFLAGS) $(CPPFLAGS) -o hybrid-rev $(SRCDIR)/hybrid-rev.c $(LDFLAGS) $(LIBS) -L. -lntru -lm -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
#include <stdio.h>
#include <stdlib.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
#include <string.h>
#include <math.h>
#include "ntru.h"
char *stripchars = "\r\n";
uint8_t pub_arr_imp[ntru_pub_len(&EES1087EP2)];
- uint8_t priv_arr_imp[ntru_priv_len(&EES1087EP2)];
+ uint8_t priv_arr_imp[ntru_priv_len(&EES1087EP2)];
if (decMode == 1) { // don't load it unless we need it
printf("enter coconut password to retrieve lime: ");
fseek(Handle,sizeof(header_privline),SEEK_SET);
fread(priv_buf,(sizeof(char)),(ntru_priv_len(&EES1087EP2)*2)+30,Handle);
zStrrmv(priv_buf, priv_buf2,stripchars, (ntru_priv_len(&EES1087EP2)*2));
+
hexStringToBytes(priv_buf, &priv_arr_imp, ntru_priv_len(&EES1087EP2));
int xl;
shake_outp[xl] = priv_arr_imp[xl] ^ shake_finalp[xl];
}
- free(priv_buf2);
fclose(Handle);
}
- ntru_import_priv(shake_outp, &kr.priv);
+ NtruEncPrivKey krpriv;
+ printf("importing\n");
+ ntru_import_priv(shake_outp, &krpriv);
+ kr.priv = krpriv;
printf("private key loaded\n");
}
printf("importing NTRU public key from file %s\n",pkname);
{
char pub_buf[(sizeof(pub_arr_imp)*2)+60];
char pub_buf2[(sizeof(pub_arr_imp)*2)+60];
+
fseek(Handle,sizeof(header_publine), SEEK_SET);
fread(pub_buf,(sizeof(char)), (ntru_pub_len(&EES1087EP2)*2)+60,Handle);
zStrrmv(pub_buf, pub_buf2,stripchars, (ntru_pub_len(&EES1087EP2)*2));
hexStringToBytes(pub_buf, &pub_arr_imp, ntru_pub_len(&EES1087EP2));
- free(pub_buf2);
fclose(Handle);
}
- ntru_import_pub(pub_arr_imp, &kr.pub);
+ NtruEncPubKey krpub;
+ ntru_import_pub(pub_arr_imp, &krpub);
+ kr.pub=krpub;
printf("keys imported.\n");
struct fileHeader {
struct fileHeader myInfo;
int remainder, xx;
float blocks;
-
+
+ struct stat in_info;
+ stat(sfname, &in_info);
input = fopen(sfname, "rb");
output = fopen(ofname, "wb");
- fseek(input, 0, SEEK_END);
- myInfo.fileSize=ftell(input);
- rewind(input);
-
+ myInfo.fileSize=in_info.st_size;
+ lseek(input,0, SEEK_SET);
blocks = floor((myInfo.fileSize / 170));
- remainder = myInfo.fileSize - (170 * blocks);
- myInfo.fileSize=(int) blocks;
+ remainder = (myInfo.fileSize - (170 * blocks));
+ myInfo.fileSize=blocks;
fwrite(&myInfo, sizeof(struct fileHeader), 1, output);
-
if (ntru_rand_init(&rand_sk_ctx, &rng_sk) != NTRU_SUCCESS)
printf("rng_sk fail\n");
if (ntru_rand_generate(shake_key, 170, &rand_sk_ctx) != NTRU_SUCCESS) {
if (ntru_encrypt(shake_key, 170, &kr.pub, &EES1087EP2, &rand_sk_ctx, enc) == NTRU_SUCCESS)
fwrite(enc, sizeof(enc),1, output);
FIPS202_SHAKE256(shake_key, 170, (unsigned char *) &stream_block, 170);
- while ((nt=fread(fptr,sizeof(char),170, input)) == 170) {
+ while ((nt=fread(fptr,sizeof(char), 170, input)) == 170) {
fbuf[nt] = '\0';
for (xx=0;xx<nt;xx++) {
stream_final[xx] = fbuf[xx] ^ stream_block[xx];
printf("rng_sk fail\n");
input = fopen(sfname, "rb");
output = fopen(ofname, "wb");
-
fread(&myInfo,sizeof(struct fileHeader),1,input);
fread(decptr,sizeof(char),1495,input);
ntru_decrypt(decptr, &kr, &EES1087EP2,&shake_key, (uint16_t *) &dec_len);