Skip to content

Commit

Permalink
Implement NTRU_AVOID_HAMMING_WT_PATENT; make Makefiles more consistent
Browse files Browse the repository at this point in the history
The NTRU_AVOID_HAMMING_WT_PATENT preprocessor flag removes all code affected by U.S. patent 7031468.
This commit also applies commits 1308bb4 and 67a2fbf to Makefile.win and Makefile.osx for consistency.
  • Loading branch information
tbuktu committed Apr 17, 2014
1 parent 53bb69e commit 2724bf1
Show file tree
Hide file tree
Showing 17 changed files with 188 additions and 56 deletions.
25 changes: 21 additions & 4 deletions Makefile
Expand Up @@ -16,6 +16,7 @@ INST_HEADERS=ntru.h types.h key.h encparams.h hash.h rand.h err.h
LIB_OBJS_PATHS=$(patsubst %,$(SRCDIR)/%,$(LIB_OBJS))
TEST_OBJS_PATHS=$(patsubst %,$(TESTDIR)/%,$(TEST_OBJS))
DIST_NAME=libntru-$(VERSION)
MAKEFILENAME=$(lastword $(MAKEFILE_LIST))

.PHONY: all
all: lib
Expand Down Expand Up @@ -60,9 +61,25 @@ dist:
tar cf $(DIST_NAME).tar.xz $(DIST_NAME) --lzma
rm -rf $(DIST_NAME)

test: lib $(TEST_OBJS_PATHS)
$(CC) $(CFLAGS) $(CPPFLAGS) -o test $(TEST_OBJS_PATHS) $(LDFLAGS) -L. -lntru -lm
LD_LIBRARY_PATH=. ./test
.PHONY: test
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: lib $(SRCDIR)/bench.o
$(CC) $(CFLAGS) $(CPPFLAGS) -o bench $(SRCDIR)/bench.o $(LDFLAGS) -L. -lntru
Expand All @@ -76,7 +93,7 @@ tests/%.o: tests/%.c
.PHONY: clean
clean:
@# also clean files generated on other OSes
rm -f $(SRCDIR)/*.o $(TESTDIR)/*.o libntru.so libntru.dylib libntru.dll test test.exe bench bench.exe
rm -f $(SRCDIR)/*.o $(TESTDIR)/*.o libntru.so libntru.dylib libntru.dll testham testnoham testham.exe testnoham.exe bench bench.exe

.PHONY: distclean
distclean: clean
Expand Down
66 changes: 44 additions & 22 deletions Makefile.osx
@@ -1,44 +1,50 @@
CC=gcc
CFLAGS=-g -Wall -Wextra -Wno-unused-parameter -O2
LIBS+=-lrt
SRCDIR=src
TESTDIR=tests
LIB_OBJS=bitstring.o encparams.o hash.o idxgen.o key.o mgf.o ntru.o poly.o rand.o sha1.o sha2.o
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.2
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

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

.PHONY: all
all: lib

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

.PHONY: install
install: lib
test -d $(INST_PFX) || mkdir -p $(INST_PFX)
test -d $(INST_PFX)/lib || mkdir $(INST_PFX)/lib
test -d $(INST_PFX)/include/libntru || mkdir -p $(INST_PFX)/include/libntru
test -d $(INST_PFX)/share/doc/libntru || mkdir -p $(INST_PFX)/share/doc/libntru
install -m 0755 libntru.so $(INST_PFX)/lib/libntru.so
install -m 0644 README.md $(INST_PFX)/share/doc/libntru/README.md
for header in $(INST_HEADERS); do \
install -m 0644 $(SRCDIR)/$$header $(INST_PFX)/include/libntru/; \
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

.PHONY: uninstall
uninstall:
rm -f $(INST_PFX)/lib/libntru.so
rm -f $(INST_PFX)/share/doc/libntru/README.md
rmdir $(INST_PFX)/share/doc/libntru/
for header in $(INST_HEADERS); do \
rm $(INST_PFX)/include/libntru/$$header; \
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 $(INST_PFX)/include/libntru/
rmdir "$(DESTDIR)$(INST_INCLUDE)/"

.PHONY: dist
dist:
Expand All @@ -54,23 +60,39 @@ dist:
tar cf $(DIST_NAME).tar.xz $(DIST_NAME) --lzma
rm -rf $(DIST_NAME)

test: lib $(TEST_OBJS_PATHS)
$(CC) $(CFLAGS) -o test $(TEST_OBJS_PATHS) -L. -lntru -lm
DYLD_LIBRARY_PATH=. ./test
.PHONY: test
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 $(SRCDIR)/bench.o
$(CC) $(CFLAGS) -o bench $(SRCDIR)/bench.o -L. -lntru
$(CC) $(CFLAGS) $(CPPFLAGS) -o bench $(SRCDIR)/bench.o $(LDFLAGS) -L. -lntru

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

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

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

.PHONY: distclean
distclean: clean
Expand Down
69 changes: 48 additions & 21 deletions Makefile.win
@@ -1,40 +1,49 @@
CC?=gcc
CFLAGS=-g -Wall -Wextra -Wno-unused-parameter -O2
CFLAGS?=-g -O2
CFLAGS+=-Wall -Wextra -Wno-unused-parameter
LIBS+=-lrt
SRCDIR=src
TESTDIR=tests
LIB_OBJS=bitstring.o encparams.o hash.o idxgen.o key.o mgf.o ntru.o poly.o rand.o sha1.o sha2.o
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.2
INST_PFX=%PROGRAMFILES%
INST_LIBDIR=$(INST_PFX)\libntru
INST_INCLUDE=$(INST_PFX)\libntru\include
INST_DOCDIR=$(INST_PFX)\libntru
INST_HEADERS=ntru.h types.h key.h encparams.h hash.h rand.h err.h

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

.PHONY: all
all: lib

.PHONY: lib
lib: $(LIB_OBJS_PATHS)
$(CC) $(CFLAGS) -shared -o libntru.dll $(LIB_OBJS_PATHS) -lws2_32 -ladvapi32
$(CC) $(CFLAGS) $(CPPFLAGS) -shared -o libntru.dll $(LIB_OBJS_PATHS) -lws2_32 -ladvapi32

.PHONY: install
install: lib
if not exist "%PROGRAMFILES%\libntru" mkdir "%PROGRAMFILES%\libntru"
if not exist "%PROGRAMFILES%\libntru\include" mkdir "%PROGRAMFILES%\libntru\include"
copy libntru.dll "%PROGRAMFILES%\libntru"
copy README.md "%PROGRAMFILES%\libntru"
if not exist "$(DESTDIR)$(INST_PFX)" mkdir "$(DESTDIR)$(INST_PFX)"
if not exist "$(DESTDIR)$(INST_LIBDIR)" mkdir "$(DESTDIR)$(INST_LIBDIR)"
if not exist "$(DESTDIR)$(INST_INCLUDE)" mkdir "$(DESTDIR)$(INST_INCLUDE)"
if not exist "$(DESTDIR)$(INST_DOCDIR)" mkdir "$(DESTDIR)$(INST_DOCDIR)"
copy libntru.dll "$(DESTDIR)$(INST_LIBDIR)"
copy README.md "$(DESTDIR)$(INST_DOCDIR)"
for %%h in ($(INST_HEADERS)) do \
copy $(SRCDIR)\%%h "%PROGRAMFILES%\libntru\include"
copy $(SRCDIR)\%%h "$(INST_INCLUDE)"

uninstall:
if exist "%PROGRAMFILES%\libntru\libntru.dll" del "%PROGRAMFILES%\libntru\libntru.dll"
if exist "%PROGRAMFILES%\libntru\README.md" del "%PROGRAMFILES%\libntru\README.md"
for %%h in ($(INST_HEADERS)) do \
if exist "%PROGRAMFILES%\libntru\include\%%h" del "%PROGRAMFILES%\libntru\include\%%h"
if exist "%PROGRAMFILES%\libntru\include" rmdir "%PROGRAMFILES%\libntru\include"
if exist "%PROGRAMFILES%\libntru" rmdir "%PROGRAMFILES%\libntru"
if exist "$(DESTDIR)$(INST_LIBDIR)\libntru.dll" del "$(DESTDIR)$(INST_LIBDIR)\libntru.dll"
if exist "$(DESTDIR)$(INST_DOCDIR)\README.md" del "$(DESTDIR)$(INST_DOCDIR)\README.md"
for %%h in ($(DESTDIR)$(INST_HEADERS)) do \
if exist "$(DESTDIR)$(INST_INCLUDE)\%%h" del "$(DESTDIR)$(INST_INCLUDE)\%%h"
if exist "$(DESTDIR)$(INST_INCLUDE)" rmdir "$(DESTDIR)$(INST_INCLUDE)"
if exist "$(DESTDIR)$(INST_LIBDIR)" rmdir "$(DESTDIR)$(INST_LIBDIR)"
if exist "$(DESTDIR)$(INST_DOCDIR)" rmdir "$(DESTDIR)$(INST_DOCDIR)"

.PHONY: dist
dist:
Expand Down Expand Up @@ -62,30 +71,48 @@ dist:
@rem zip is provided by MinGW
zip -rm $(DIST_NAME).zip $(DIST_NAME)

test: lib $(TEST_OBJS_PATHS)
$(CC) $(CFLAGS) -o test.exe $(TEST_OBJS_PATHS) -L. -lntru -lm
test.exe
.PHONY: test
test:
$(MAKE) -f $(MAKEFILENAME) testnoham
@echo.
@echo Testing patent-reduced build
testnoham.exe
$(MAKE) -f $(MAKEFILENAME) testham
@echo.
@echo Testing full build
testham.exe

testham: clean lib $(TEST_OBJS_PATHS)
@echo CFLAGS=$(CFLAGS)
$(CC) $(CFLAGS) -o testham.exe $(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.exe $(TEST_OBJS_PATHS) -L. -lntru -lm

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

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

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

.PHONY: clean
clean:
@if exist $(SRCDIR)\*.o del $(SRCDIR)\*.o
@if exist $(TESTDIR)\*.o del $(TESTDIR)\*.o
@if exist libntru.dll del libntru.dll
@if exist test.exe del test.exe
@if exist testham.exe del testham.exe
@if exist testnoham.exe del testnoham.exe
@if exist bench.exe del bench.exe
@rem ***** clean files generated on other OSes *****
@if exist libntru.so del libntru.so
@if exist libntru.dylib del libntru.dylib
@if exist test del test
@if exist testham del testnoham
@if exist testnoham del testnoham
@if exist bench del bench

.PHONY: distclean
Expand Down
4 changes: 2 additions & 2 deletions README.md
Expand Up @@ -4,8 +4,8 @@ An implementation of the public-key encryption scheme NTRUEncrypt in C.

NTRU's main strengths are high performance and resistance to quantum computer
attacks. Its main drawback is that it is patent encumbered. The patents expire
in 2020; it is possible to modify this implementation so it becomes patent-free
in 2017.
in 2020; when built with the NTRU_AVOID_HAMMING_WT_PATENT flag, libntru becomes
patent-free in 2017.
For more information on the NTRUEncrypt algorithm, see the NTRU introduction
page:

Expand Down
2 changes: 2 additions & 0 deletions src/encparams.h
Expand Up @@ -384,6 +384,7 @@ typedef struct NtruEncParams {
256 /* pklen */\
}

#ifndef NTRU_AVOID_HAMMING_WT_PATENT
/*
* A product-form parameter set that gives 112 bits of security.
*/
Expand Down Expand Up @@ -479,6 +480,7 @@ typedef struct NtruEncParams {
32, /* hlen */\
256 /* pklen */\
}
#endif /* NTRU_AVOID_HAMMING_WT_PATENT */

uint16_t ntru_enc_len(NtruEncParams *params);

Expand Down
11 changes: 10 additions & 1 deletion src/key.c
Expand Up @@ -85,7 +85,11 @@ uint16_t ntru_export_priv(NtruEncPrivKey *key, uint8_t *arr) {
uint8_t prod_flag = key->prod_flag;

/* write N */
#ifndef NTRU_AVOID_HAMMING_WT_PATENT
uint16_t N_endian = prod_flag ? htons(key->t.prod.N) : htons(key->t.tern.N);
#else
uint16_t N_endian = htons(key->t.tern.N);
#endif /* NTRU_AVOID_HAMMING_WT_PATENT */
memcpy(arr_head, &N_endian, sizeof N_endian);
arr_head += sizeof N_endian;

Expand All @@ -99,12 +103,14 @@ uint16_t ntru_export_priv(NtruEncPrivKey *key, uint8_t *arr) {
arr_head++;

/* write f1, f2, f3 */
#ifndef NTRU_AVOID_HAMMING_WT_PATENT
if (prod_flag) {
arr_head += ntru_tern_to_arr(&key->t.prod.f1, arr_head);
arr_head += ntru_tern_to_arr(&key->t.prod.f2, arr_head);
arr_head += ntru_tern_to_arr(&key->t.prod.f3, arr_head);
}
else
#endif /* NTRU_AVOID_HAMMING_WT_PATENT */
arr_head += ntru_tern_to_arr(&key->t.tern, arr_head);

return arr_head - arr;
Expand Down Expand Up @@ -160,13 +166,16 @@ void ntru_import_priv(uint8_t *arr, NtruEncPrivKey *key) {
key->prod_flag = (flags&4) != 0;
arr++;

#ifndef NTRU_AVOID_HAMMING_WT_PATENT
if (key->prod_flag) {
key->t.prod.N = N;
arr += ntru_tern_from_arr(arr, N, &key->t.prod.f1);
arr += ntru_tern_from_arr(arr, N, &key->t.prod.f2);
arr += ntru_tern_from_arr(arr, N, &key->t.prod.f3);
}
else {
else
#endif /* NTRU_AVOID_HAMMING_WT_PATENT */
{
key->t.tern.N = N;
arr += ntru_tern_from_arr(arr, key->t.tern.N, &key->t.tern);
}
Expand Down

0 comments on commit 2724bf1

Please sign in to comment.