@@ -58,7 +58,7 @@ PROJECT_LOGO = | |||||
# entered, it will be relative to the location where doxygen was started. If | # entered, it will be relative to the location where doxygen was started. If | ||||
# left blank the current directory will be used. | # left blank the current directory will be used. | ||||
OUTPUT_DIRECTORY = doc | |||||
OUTPUT_DIRECTORY = build/doc | |||||
# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub- | # If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 4096 sub- | ||||
# directories (in 2 levels) under the output directory of each output format and | # directories (in 2 levels) under the output directory of each output format and | ||||
@@ -5,6 +5,20 @@ | |||||
UNAME := $(shell uname) | UNAME := $(shell uname) | ||||
MACHINE := $(shell uname -m) | MACHINE := $(shell uname -m) | ||||
# Subdirectories for objects etc. | |||||
# Many of them are mapped to build/obj right now, but could be split later. | |||||
# The non-build/obj directories are the public interface. | |||||
BUILD_ASM = build/obj | |||||
BUILD_OBJ = build/obj | |||||
BUILD_C = build/obj | |||||
BUILD_PY = build/obj | |||||
BUILD_LIB = build/lib | |||||
BUILD_INC = build/include | |||||
BUILD_BIN = build/bin | |||||
BUILD_IBIN = build/obj/bin | |||||
BATBASE=ed448goldilocks_decaf_bats_$(TODAY) | |||||
BATNAME=build/$(BATBASE) | |||||
ifeq ($(UNAME),Darwin) | ifeq ($(UNAME),Darwin) | ||||
CC = clang | CC = clang | ||||
CXX = clang++ | CXX = clang++ | ||||
@@ -29,9 +43,8 @@ FIELD ?= p25519 | |||||
WARNFLAGS = -pedantic -Wall -Wextra -Werror -Wunreachable-code \ | WARNFLAGS = -pedantic -Wall -Wextra -Werror -Wunreachable-code \ | ||||
-Wmissing-declarations -Wunused-function -Wno-overlength-strings $(EXWARN) | -Wmissing-declarations -Wunused-function -Wno-overlength-strings $(EXWARN) | ||||
INCFLAGS = -Isrc/include -Iinclude -Isrc/$(FIELD) -Isrc/$(FIELD)/$(ARCH) | |||||
INCFLAGS = -Isrc/include -Isrc/public_include -Isrc/$(FIELD) -Isrc/$(FIELD)/$(ARCH) | |||||
LANGFLAGS = -std=c99 -fno-strict-aliasing | LANGFLAGS = -std=c99 -fno-strict-aliasing | ||||
LANGXXFLAGS = -fno-strict-aliasing | LANGXXFLAGS = -fno-strict-aliasing | ||||
GENFLAGS = -ffunction-sections -fdata-sections -fvisibility=hidden -fomit-frame-pointer -fPIC | GENFLAGS = -ffunction-sections -fdata-sections -fvisibility=hidden -fomit-frame-pointer -fPIC | ||||
@@ -55,136 +68,143 @@ ifeq ($(CC),clang) | |||||
WARNFLAGS += -Wgcc-compat | WARNFLAGS += -Wgcc-compat | ||||
endif | endif | ||||
SAGE ?= sage | |||||
SAGES= $(shell ls test/*.sage) | |||||
BUILDPYS= $(SAGES:test/%.sage=build/%.py) | |||||
ARCHFLAGS += $(XARCHFLAGS) | ARCHFLAGS += $(XARCHFLAGS) | ||||
CFLAGS = $(LANGFLAGS) $(WARNFLAGS) $(INCFLAGS) $(OFLAGS) $(ARCHFLAGS) $(GENFLAGS) $(XCFLAGS) | CFLAGS = $(LANGFLAGS) $(WARNFLAGS) $(INCFLAGS) $(OFLAGS) $(ARCHFLAGS) $(GENFLAGS) $(XCFLAGS) | ||||
CXXFLAGS = $(LANGXXFLAGS) $(WARNFLAGS) $(INCFLAGS) $(OFLAGS) $(ARCHFLAGS) $(GENFLAGS) $(XCXXFLAGS) | CXXFLAGS = $(LANGXXFLAGS) $(WARNFLAGS) $(INCFLAGS) $(OFLAGS) $(ARCHFLAGS) $(GENFLAGS) $(XCXXFLAGS) | ||||
LDFLAGS = $(ARCHFLAGS) $(XLDFLAGS) | LDFLAGS = $(ARCHFLAGS) $(XLDFLAGS) | ||||
ASFLAGS = $(ARCHFLAGS) $(XASFLAGS) | ASFLAGS = $(ARCHFLAGS) $(XASFLAGS) | ||||
.PHONY: clean all test bench todo doc lib bat sage sagetest | |||||
.PRECIOUS: build/%.s | |||||
SAGE ?= sage | |||||
SAGES= $(shell ls test/*.sage) | |||||
BUILDPYS= $(SAGES:test/%.sage=$(BUILD_PY)/%.py) | |||||
HEADERS= Makefile $(shell find src include test -name "*.h") $(shell find . -name "*.hxx") build/timestamp | |||||
.PHONY: clean all test bench todo doc lib bat sage sagetest | |||||
.PRECIOUS: $(BUILD_ASM)/%.s | |||||
HEADERS= Makefile $(shell find src test -name "*.h") $(shell find . -name "*.hxx") $(BUILD_OBJ)/timestamp | |||||
DECAFCOMPONENTS= build/$(DECAF).o build/shake.o build/decaf_crypto.o \ | |||||
build/$(FIELD).o build/f_arithmetic.o build/utils.o | |||||
DECAFCOMPONENTS= $(BUILD_OBJ)/$(DECAF).o $(BUILD_OBJ)/shake.o $(BUILD_OBJ)/decaf_crypto.o \ | |||||
$(BUILD_OBJ)/$(FIELD).o $(BUILD_OBJ)/f_arithmetic.o $(BUILD_OBJ)/utils.o | |||||
ifeq ($(DECAF),decaf_fast) | ifeq ($(DECAF),decaf_fast) | ||||
DECAFCOMPONENTS += build/decaf_tables.o | |||||
DECAFCOMPONENTS += $(BUILD_OBJ)/decaf_tables.o | |||||
endif | endif | ||||
BENCHCOMPONENTS = build/bench.o build/shake.o | |||||
BATBASE=ed448goldilocks_decaf_bats_$(TODAY) | |||||
BATNAME=build/$(BATBASE) | |||||
BENCHCOMPONENTS = $(BUILD_OBJ)/bench.o $(BUILD_OBJ)/shake.o | |||||
all: lib build/test build/bench build/shakesum | |||||
all: lib $(BUILD_IBIN)/test $(BUILD_IBIN)/bench $(BUILD_BIN)/shakesum | |||||
scan: clean | scan: clean | ||||
scan-build --use-analyzer=`which clang` \ | scan-build --use-analyzer=`which clang` \ | ||||
-enable-checker deadcode -enable-checker llvm \ | -enable-checker deadcode -enable-checker llvm \ | ||||
-enable-checker osx -enable-checker security -enable-checker unix \ | -enable-checker osx -enable-checker security -enable-checker unix \ | ||||
make build/bench build/test all | |||||
make all | |||||
# The shakesum utility is in the public bin directory. | |||||
$(BUILD_BIN)/shakesum: $(BUILD_OBJ)/shakesum.o $(BUILD_OBJ)/shake.o $(BUILD_OBJ)/utils.o | |||||
$(LD) $(LDFLAGS) -o $@ $^ | |||||
# The main decaf library, and its symlinks. | |||||
lib: $(BUILD_LIB)/libdecaf.so | |||||
build/test: build/test_decaf.o lib | |||||
$(BUILD_LIB)/libdecaf.so: $(BUILD_LIB)/libdecaf.so.1 | |||||
ln -sf `basename $^` $@ | |||||
$(BUILD_LIB)/libdecaf.so.1: $(DECAFCOMPONENTS) | |||||
rm -f $@ | |||||
ifeq ($(UNAME),Darwin) | ifeq ($(UNAME),Darwin) | ||||
$(LDXX) $(LDFLAGS) -o $@ $< -Lbuild -ldecaf | |||||
libtool -macosx_version_min 10.6 -dynamic -dead_strip -lc -x -o $@ \ | |||||
$(DECAFCOMPONENTS) | |||||
else | else | ||||
$(LDXX) $(LDFLAGS) -Wl,-rpath,`pwd`/build -o $@ $< -Lbuild -ldecaf | |||||
$(LD) $(LDFLAGS) -shared -Wl,-soname,`basename $@` -Wl,--gc-sections -o $@ $(DECAFCOMPONENTS) | |||||
strip --discard-all $@ | |||||
endif | endif | ||||
build/bench: build/bench_decaf.o lib | |||||
# Internal test programs, which are not part of the final build/bin directory. | |||||
$(BUILD_IBIN)/test: $(BUILD_OBJ)/test_decaf.o lib | |||||
ifeq ($(UNAME),Darwin) | ifeq ($(UNAME),Darwin) | ||||
$(LDXX) $(LDFLAGS) -o $@ $< -Lbuild -ldecaf | |||||
$(LDXX) $(LDFLAGS) -o $@ $< -L$(BUILD_LIB) -ldecaf | |||||
else | else | ||||
$(LDXX) $(LDFLAGS) -Wl,-rpath,`pwd`/build -o $@ $< -Lbuild -ldecaf | |||||
$(LDXX) $(LDFLAGS) -Wl,-rpath,`pwd`/$(BUILD_LIB) -o $@ $< -L$(BUILD_LIB) -ldecaf | |||||
endif | endif | ||||
build/shakesum: build/shakesum.o build/shake.o build/utils.o | |||||
$(LD) $(LDFLAGS) -o $@ $^ | |||||
lib: build/libdecaf.so | |||||
build/libdecaf.so: $(DECAFCOMPONENTS) | |||||
rm -f $@ | |||||
$(BUILD_IBIN)/bench: $(BUILD_OBJ)/bench_decaf.o lib | |||||
ifeq ($(UNAME),Darwin) | ifeq ($(UNAME),Darwin) | ||||
libtool -macosx_version_min 10.6 -dynamic -dead_strip -lc -x -o $@ \ | |||||
$(DECAFCOMPONENTS) | |||||
$(LDXX) $(LDFLAGS) -o $@ $< -L$(BUILD_LIB) -ldecaf | |||||
else | else | ||||
$(LD) $(LDFLAGS) -shared -Wl,-soname,libdecaf.so.1 -Wl,--gc-sections -o $@ $(DECAFCOMPONENTS) | |||||
strip --discard-all $@ | |||||
ln -sf `basename $@` build/libdecaf.so.1 | |||||
$(LDXX) $(LDFLAGS) -Wl,-rpath,`pwd`/$(BUILD_LIB) -o $@ $< -L$(BUILD_LIB) -ldecaf | |||||
endif | endif | ||||
build/timestamp: | |||||
mkdir -p build | |||||
# Create all the build subdirectories | |||||
$(BUILD_OBJ)/timestamp: | |||||
mkdir -p $(BUILD_ASM) $(BUILD_OBJ) $(BUILD_C) $(BUILD_PY) \ | |||||
$(BUILD_LIB) $(BUILD_INC) $(BUILD_BIN) $(BUILD_IBIN) $(BUILD_INC)/decaf | |||||
touch $@ | touch $@ | ||||
build/%.o: build/%.s | |||||
$(BUILD_OBJ)/%.o: $(BUILD_ASM)/%.s | |||||
$(ASM) $(ASFLAGS) -c -o $@ $< | $(ASM) $(ASFLAGS) -c -o $@ $< | ||||
build/decaf_gen_tables: build/decaf_gen_tables.o build/$(DECAF).o build/$(FIELD).o build/f_arithmetic.o build/utils.o | |||||
$(BUILD_IBIN)/decaf_gen_tables: $(BUILD_OBJ)/decaf_gen_tables.o \ | |||||
$(BUILD_OBJ)/$(DECAF).o $(BUILD_OBJ)/$(FIELD).o $(BUILD_OBJ)/f_arithmetic.o $(BUILD_OBJ)/utils.o | |||||
$(LD) $(LDFLAGS) -o $@ $^ | $(LD) $(LDFLAGS) -o $@ $^ | ||||
build/decaf_tables.c: build/decaf_gen_tables | |||||
$(BUILD_C)/decaf_tables.c: $(BUILD_IBIN)/decaf_gen_tables | |||||
./$< > $@ | ./$< > $@ | ||||
build/decaf_tables.s: build/decaf_tables.c $(HEADERS) | |||||
$(BUILD_ASM)/decaf_tables.s: $(BUILD_C)/decaf_tables.c $(HEADERS) | |||||
$(CC) $(CFLAGS) -S -c -o $@ $< | $(CC) $(CFLAGS) -S -c -o $@ $< | ||||
build/%.s: src/%.c $(HEADERS) | |||||
$(BUILD_ASM)/%.s: src/%.c $(HEADERS) | |||||
$(CC) $(CFLAGS) -S -c -o $@ $< | $(CC) $(CFLAGS) -S -c -o $@ $< | ||||
build/%.s: src/%.cxx $(HEADERS) | |||||
$(BUILD_ASM)/%.s: src/%.cxx $(HEADERS) | |||||
$(CXX) $(CXXFLAGS) -S -c -o $@ $< | $(CXX) $(CXXFLAGS) -S -c -o $@ $< | ||||
build/%.s: test/%.c $(HEADERS) | |||||
$(BUILD_ASM)/%.s: test/%.c $(HEADERS) | |||||
$(CC) $(CFLAGS) -S -c -o $@ $< | $(CC) $(CFLAGS) -S -c -o $@ $< | ||||
build/%.s: test/%.cxx $(HEADERS) | |||||
$(BUILD_ASM)/%.s: test/%.cxx $(HEADERS) | |||||
$(CXX) $(CXXFLAGS) -S -c -o $@ $< | $(CXX) $(CXXFLAGS) -S -c -o $@ $< | ||||
build/%.s: src/$(FIELD)/$(ARCH)/%.c $(HEADERS) | |||||
$(BUILD_ASM)/%.s: src/$(FIELD)/$(ARCH)/%.c $(HEADERS) | |||||
$(CC) $(CFLAGS) -S -c -o $@ $< | $(CC) $(CFLAGS) -S -c -o $@ $< | ||||
build/%.s: src/$(FIELD)/%.c $(HEADERS) | |||||
$(BUILD_ASM)/%.s: src/$(FIELD)/%.c $(HEADERS) | |||||
$(CC) $(CFLAGS) -S -c -o $@ $< | $(CC) $(CFLAGS) -S -c -o $@ $< | ||||
# The sage test scripts | |||||
sage: $(BUILDPYS) | sage: $(BUILDPYS) | ||||
sagetest: sage lib | sagetest: sage lib | ||||
LD_LIBRARY_PATH=build sage build/test_decaf.sage | |||||
LD_LIBRARY_PATH=$(BUILD_LIB) sage $(BUILD_PY)/test_decaf.sage | |||||
$(BUILDPYS): $(SAGES) build/timestamp | |||||
cp -f $(SAGES) build/ | |||||
$(SAGE) --preparse $(SAGES:test/%.sage=build/%.sage) | |||||
$(BUILDPYS): $(SAGES) $(BUILD_OBJ)/timestamp | |||||
cp -f $(SAGES) $(BUILD_PY)/ | |||||
$(SAGE) --preparse $(SAGES:test/%.sage=$(BUILD_PY)/%.sage) | |||||
# some sage versions compile to .sage.py | # some sage versions compile to .sage.py | ||||
for f in $(SAGES:test/%.sage=build/%); do \ | |||||
for f in $(SAGES:test/%.sage=$(BUILD_PY)/%); do \ | |||||
if [ -e $$f.sage.py ]; then \ | if [ -e $$f.sage.py ]; then \ | ||||
mv $$f.sage.py $$f.py; \ | mv $$f.sage.py $$f.py; \ | ||||
fi; \ | fi; \ | ||||
done | done | ||||
doc/timestamp: | |||||
mkdir -p doc | |||||
# The documentation files | |||||
$(BUILD_DOC)/timestamp: | |||||
mkdir -p `dirname $@` | |||||
touch $@ | touch $@ | ||||
doc: Doxyfile doc/timestamp include/*.h src/*.c src/include/*.h src/$(FIELD)/$(ARCH)/*.c src/$(FIELD)/$(ARCH)/*.h | |||||
doc: Doxyfile $(BUILD_OBJ)/timestamp $(HEADERS) src/*.c src/$(FIELD)/$(ARCH)/*.c src/$(FIELD)/$(ARCH)/*.h | |||||
doxygen > /dev/null | doxygen > /dev/null | ||||
# The eBATS benchmarking script | |||||
bat: $(BATNAME) | bat: $(BATNAME) | ||||
$(BATNAME): include/* src/* src/*/* test/batarch.map build/decaf_tables.c # TODO tables some other way | |||||
$(BATNAME): include/* src/* src/*/* test/batarch.map $(BUILD_C)/decaf_tables.c # TODO tables some other way | |||||
rm -fr $@ | rm -fr $@ | ||||
for prim in dh sign; do \ | for prim in dh sign; do \ | ||||
targ="$@/crypto_$$prim/ed448goldilocks_decaf"; \ | targ="$@/crypto_$$prim/ed448goldilocks_decaf"; \ | ||||
(while read arch where; do \ | (while read arch where; do \ | ||||
mkdir -p $$targ/`basename $$arch`; \ | mkdir -p $$targ/`basename $$arch`; \ | ||||
cp include/*.h build/decaf_tables.c src/decaf_fast.c src/decaf_crypto.c src/shake.c src/include/*.h src/bat/$$prim.c src/p448/$$where/*.c src/p448/$$where/*.h src/p448/*.c src/p448/*.h $$targ/`basename $$arch`; \ | |||||
cp include/*.h $(BUILD_C)/decaf_tables.c src/decaf_fast.c src/decaf_crypto.c src/shake.c src/include/*.h src/bat/$$prim.c src/p448/$$where/*.c src/p448/$$where/*.h src/p448/*.c src/p448/*.h $$targ/`basename $$arch`; \ | |||||
cp src/bat/api_$$prim.h $$targ/`basename $$arch`/api.h; \ | cp src/bat/api_$$prim.h $$targ/`basename $$arch`/api.h; \ | ||||
perl -p -i -e 's/SYSNAME/'`basename $(BATNAME)`_`basename $$arch`'/g' $$targ/`basename $$arch`/api.h; \ | perl -p -i -e 's/SYSNAME/'`basename $(BATNAME)`_`basename $$arch`'/g' $$targ/`basename $$arch`/api.h; \ | ||||
perl -p -i -e 's/__TODAY__/'$(TODAY)'/g' $$targ/`basename $$arch`/api.h; \ | perl -p -i -e 's/__TODAY__/'$(TODAY)'/g' $$targ/`basename $$arch`/api.h; \ | ||||
@@ -193,31 +213,31 @@ $(BATNAME): include/* src/* src/*/* test/batarch.map build/decaf_tables.c # TODO | |||||
echo 'Mike Hamburg' > $$targ/designers; \ | echo 'Mike Hamburg' > $$targ/designers; \ | ||||
echo 'Ed448-Goldilocks Decaf sign and dh' > $$targ/description; \ | echo 'Ed448-Goldilocks Decaf sign and dh' > $$targ/description; \ | ||||
done | done | ||||
(cd build && tar czf $(BATBASE).tgz $(BATBASE) ) | |||||
(cd $(BATNAME)/.. && tar czf $(BATBASE).tgz $(BATBASE) ) | |||||
# Finds todo items in .h and .c files | |||||
todo:: | todo:: | ||||
@(find * -name '*.h'; find * -name '*.c') | xargs egrep --color=auto -w \ | |||||
@(find * -name '*.h' -or -name '*.c' -or -name '*.cxx' -or -name '*.hxx') | xargs egrep --color=auto -w \ | |||||
'HACK|TODO|FIXME|BUG|XXX|PERF|FUTURE|REMOVE|MAGIC' | 'HACK|TODO|FIXME|BUG|XXX|PERF|FUTURE|REMOVE|MAGIC' | ||||
@echo '=============================' | @echo '=============================' | ||||
@(for i in FIXME BUG XXX TODO HACK PERF FUTURE REMOVE MAGIC; do \ | @(for i in FIXME BUG XXX TODO HACK PERF FUTURE REMOVE MAGIC; do \ | ||||
(find * -name '*.h'; find * -name '*.c') | xargs egrep -w $$i > /dev/null || continue; \ | |||||
(find * -name '*.h' -or -name '*.c' -or -name '*.cxx' -or -name '*.hxx') | xargs egrep -w $$i > /dev/null || continue; \ | |||||
/bin/echo -n $$i' ' | head -c 10; \ | /bin/echo -n $$i' ' | head -c 10; \ | ||||
(find * -name '*.h'; find * -name '*.c') | xargs egrep -w $$i| wc -l; \ | |||||
(find * -name '*.h' -or -name '*.c' -or -name '*.cxx' -or -name '*.hxx') | xargs egrep -w $$i| wc -l; \ | |||||
done) | done) | ||||
@echo '=============================' | @echo '=============================' | ||||
@echo -n 'Total ' | @echo -n 'Total ' | ||||
@(find * -name '*.h'; find * -name '*.c') | xargs egrep -w \ | |||||
@(find * -name '*.h' -or -name '*.c' -or -name '*.cxx' -or -name '*.hxx') | xargs egrep -w \ | |||||
'HACK|TODO|FIXME|BUG|XXX|PERF|FUTURE|REMOVE|MAGIC' | wc -l | 'HACK|TODO|FIXME|BUG|XXX|PERF|FUTURE|REMOVE|MAGIC' | wc -l | ||||
bench: build/bench | |||||
bench: $(BUILD_IBIN)/bench | |||||
./$< | ./$< | ||||
test: build/test | |||||
build/test | |||||
test: $(BUILD_IBIN)/test | |||||
./$< | |||||
microbench: build/bench | |||||
microbench: $(BUILD_IBIN)/bench | |||||
./$< --micro | ./$< --micro | ||||
clean: | clean: | ||||
rm -fr build doc $(BATNAME) | |||||
rm -fr build $(BATNAME) |
@@ -9,7 +9,7 @@ | |||||
*/ | */ | ||||
#define __STDC_WANT_LIB_EXT1__ 1 /* for memset_s */ | #define __STDC_WANT_LIB_EXT1__ 1 /* for memset_s */ | ||||
#include "decaf.h" | |||||
#include <decaf.h> | |||||
#include <string.h> | #include <string.h> | ||||
#include <assert.h> | #include <assert.h> | ||||
@@ -8,7 +8,7 @@ | |||||
* @brief Example Decaf cyrpto routines. | * @brief Example Decaf cyrpto routines. | ||||
*/ | */ | ||||
#include "decaf_crypto.h" | |||||
#include <decaf/crypto.h> | |||||
#include <string.h> | #include <string.h> | ||||
static const unsigned int DECAF_255_SCALAR_OVERKILL_BYTES = DECAF_255_SCALAR_BYTES + 8; | static const unsigned int DECAF_255_SCALAR_OVERKILL_BYTES = DECAF_255_SCALAR_BYTES + 8; | ||||
@@ -10,7 +10,7 @@ | |||||
#define _XOPEN_SOURCE 600 /* for posix_memalign */ | #define _XOPEN_SOURCE 600 /* for posix_memalign */ | ||||
#define __STDC_WANT_LIB_EXT1__ 1 /* for memset_s */ | #define __STDC_WANT_LIB_EXT1__ 1 /* for memset_s */ | ||||
#include "decaf.h" | |||||
#include <decaf.h> | |||||
#include <string.h> | #include <string.h> | ||||
#include "field.h" | #include "field.h" | ||||
#include "decaf_config.h" | #include "decaf_config.h" | ||||
@@ -25,8 +25,8 @@ | |||||
#include <stdint.h> | #include <stdint.h> | ||||
#include <sys/types.h> | #include <sys/types.h> | ||||
#include "decaf_255.h" | |||||
#include "decaf_448.h" | |||||
#include <decaf/decaf_255.h> | |||||
#include <decaf/decaf_448.h> | |||||
#endif /* __DECAF_H__ */ | #endif /* __DECAF_H__ */ | ||||
@@ -2,7 +2,7 @@ | |||||
#ifndef __DECAF_HXX__ | #ifndef __DECAF_HXX__ | ||||
#define __DECAF_HXX__ 1 | #define __DECAF_HXX__ 1 | ||||
#include "decaf_255.hxx" // MAGIC | |||||
#include <decaf/decaf_255.hxx> // MAGIC | |||||
#endif /* __DECAF_H__ */ | #endif /* __DECAF_H__ */ | ||||
@@ -1,5 +1,5 @@ | |||||
/** | /** | ||||
* @file decaf_common.h | |||||
* @file decaf/common.h | |||||
* @author Mike Hamburg | * @author Mike Hamburg | ||||
* | * | ||||
* @copyright | * @copyright |
@@ -1,5 +1,5 @@ | |||||
/** | /** | ||||
* @file decaf_crypto.h | |||||
* @file decaf/crypto.h | |||||
* @copyright | * @copyright | ||||
* Copyright (c) 2015 Cryptography Research, Inc. \n | * Copyright (c) 2015 Cryptography Research, Inc. \n | ||||
* Released under the MIT License. See LICENSE.txt for license information. | * Released under the MIT License. See LICENSE.txt for license information. | ||||
@@ -14,8 +14,8 @@ | |||||
#ifndef __DECAF_CRYPTO_H__ | #ifndef __DECAF_CRYPTO_H__ | ||||
#define __DECAF_CRYPTO_H__ 1 | #define __DECAF_CRYPTO_H__ 1 | ||||
#include "decaf.h" | |||||
#include "shake.h" | |||||
#include <decaf.h> | |||||
#include <decaf/shake.h> | |||||
/** Number of bytes for a symmetric key (expanded to full key) */ | /** Number of bytes for a symmetric key (expanded to full key) */ | ||||
#define DECAF_255_SYMMETRIC_KEY_BYTES 32 | #define DECAF_255_SYMMETRIC_KEY_BYTES 32 |
@@ -1,5 +1,5 @@ | |||||
/** | /** | ||||
* @file decaf_255.h | |||||
* @file decaf/decaf_255.h | |||||
* @author Mike Hamburg | * @author Mike Hamburg | ||||
* | * | ||||
* @copyright | * @copyright | ||||
@@ -11,7 +11,7 @@ | |||||
#ifndef __DECAF_255_H__ | #ifndef __DECAF_255_H__ | ||||
#define __DECAF_255_H__ 1 | #define __DECAF_255_H__ 1 | ||||
#include "decaf_common.h" | |||||
#include <decaf/common.h> | |||||
#ifdef __cplusplus | #ifdef __cplusplus | ||||
extern "C" { | extern "C" { | ||||
@@ -467,7 +467,7 @@ void decaf_255_point_debugging_pscale ( | |||||
* A factor of 2 due to the isogeny. | * A factor of 2 due to the isogeny. | ||||
* A factor of 2 because we quotient out the 2-torsion. | * A factor of 2 because we quotient out the 2-torsion. | ||||
* | * | ||||
* This makes it about 8:1 overall. | |||||
* This makes it about 8:1 overall, or 16:1 overall on curves with cofactor 8. | |||||
* | * | ||||
* Negating the input (mod q) results in the same point. Inverting the input | * Negating the input (mod q) results in the same point. Inverting the input | ||||
* (mod q) results in the negative point. This is the same as Elligator. | * (mod q) results in the negative point. This is the same as Elligator. | ||||
@@ -486,19 +486,36 @@ decaf_255_point_from_hash_nonuniform ( | |||||
const unsigned char hashed_data[DECAF_255_SER_BYTES] | const unsigned char hashed_data[DECAF_255_SER_BYTES] | ||||
) API_VIS NONNULL2 NOINLINE; | ) API_VIS NONNULL2 NOINLINE; | ||||
/** | |||||
* @brief Indifferentiable hash function encoding to curve. | |||||
* | |||||
* Equivalent to calling decaf_255_point_from_hash_nonuniform twice and adding. | |||||
* | |||||
* @param [in] hashed_data Output of some hash function. | |||||
* @param [out] pt The data hashed to the curve. | |||||
*/ | |||||
void decaf_255_point_from_hash_uniform ( | |||||
decaf_255_point_t pt, | |||||
const unsigned char hashed_data[2*DECAF_255_SER_BYTES] | |||||
) API_VIS NONNULL2 NOINLINE; | |||||
/** | /** | ||||
* @brief Inverse of elligator-like hash to curve. | * @brief Inverse of elligator-like hash to curve. | ||||
* | * | ||||
* This function writes to the buffer, to make it so that | * This function writes to the buffer, to make it so that | ||||
* decaf_255_point_from_hash_nonuniform(buffer) = pt if possible. | |||||
* decaf_255_point_from_hash_nonuniform(buffer) = pt if | |||||
* possible. Since there may be multiple preimages, the | |||||
* "which" parameter chooses between them. To ensure uniform | |||||
* inverse sampling, this function succeeds or fails | |||||
* independently for different "which" values. | |||||
* | * | ||||
* @param [out] recovered_hash Encoded data. | * @param [out] recovered_hash Encoded data. | ||||
* @param [in] pt The point to encode. | * @param [in] pt The point to encode. | ||||
* @param [in] which A "hint" that indicates which inverse to return. | |||||
* @param [in] which A value determining which inverse point | |||||
* to return. | |||||
* | * | ||||
* @retval DECAF_SUCCESS The inverse succeeded. | * @retval DECAF_SUCCESS The inverse succeeded. | ||||
* @retval DECAF_FAILURE The pt isn't the image of | |||||
* decaf_255_point_from_hash_nonuniform with the given hint. | |||||
* @retval DECAF_FAILURE The inverse failed. | |||||
*/ | */ | ||||
decaf_bool_t | decaf_bool_t | ||||
decaf_255_invert_elligator_nonuniform ( | decaf_255_invert_elligator_nonuniform ( | ||||
@@ -508,19 +525,22 @@ decaf_255_invert_elligator_nonuniform ( | |||||
) API_VIS NONNULL2 NOINLINE WARN_UNUSED; | ) API_VIS NONNULL2 NOINLINE WARN_UNUSED; | ||||
/** | /** | ||||
* @brief Inverse of elligator-like hash to curve, uniform. | |||||
* @brief Inverse of elligator-like hash to curve. | |||||
* | * | ||||
* This function modifies the first DECAF_255_SER_BYTES of the | |||||
* buffer, to make it so that | |||||
* decaf_255_point_from_hash_uniform(buffer) = pt if possible. | |||||
* This function writes to the buffer, to make it so that | |||||
* decaf_255_point_from_hash_uniform(buffer) = pt if | |||||
* possible. Since there may be multiple preimages, the | |||||
* "which" parameter chooses between them. To ensure uniform | |||||
* inverse sampling, this function succeeds or fails | |||||
* independently for different "which" values. | |||||
* | * | ||||
* @param [out] recovered_hash Encoded data. | * @param [out] recovered_hash Encoded data. | ||||
* @param [in] pt The point to encode. | * @param [in] pt The point to encode. | ||||
* @param [in] which A "hint" that indicates which inverse to return. | |||||
* @param [in] which A value determining which inverse point | |||||
* to return. | |||||
* | * | ||||
* @retval DECAF_SUCCESS The inverse succeeded. | * @retval DECAF_SUCCESS The inverse succeeded. | ||||
* @retval DECAF_FAILURE The pt isn't the image of | |||||
* decaf_255_point_from_hash_uniform with the given hint. | |||||
* @retval DECAF_FAILURE The inverse failed. | |||||
*/ | */ | ||||
decaf_bool_t | decaf_bool_t | ||||
decaf_255_invert_elligator_uniform ( | decaf_255_invert_elligator_uniform ( | ||||
@@ -529,19 +549,6 @@ decaf_255_invert_elligator_uniform ( | |||||
uint16_t which | uint16_t which | ||||
) API_VIS NONNULL2 NOINLINE WARN_UNUSED; | ) API_VIS NONNULL2 NOINLINE WARN_UNUSED; | ||||
/** | |||||
* @brief Indifferentiable hash function encoding to curve. | |||||
* | |||||
* Equivalent to calling decaf_255_point_from_hash_nonuniform twice and adding. | |||||
* | |||||
* @param [in] hashed_data Output of some hash function. | |||||
* @param [out] pt The data hashed to the curve. | |||||
*/ | |||||
void decaf_255_point_from_hash_uniform ( | |||||
decaf_255_point_t pt, | |||||
const unsigned char hashed_data[2*DECAF_255_SER_BYTES] | |||||
) API_VIS NONNULL2 NOINLINE; | |||||
/** | /** | ||||
* @brief Overwrite scalar with zeros. | * @brief Overwrite scalar with zeros. | ||||
*/ | */ |
@@ -1,5 +1,5 @@ | |||||
/** | /** | ||||
* @file decaf_255.hxx | |||||
* @file decaf/decaf_255.hxx | |||||
* @author Mike Hamburg | * @author Mike Hamburg | ||||
* | * | ||||
* @copyright | * @copyright | ||||
@@ -27,8 +27,8 @@ | |||||
#include <stdlib.h> | #include <stdlib.h> | ||||
#include <string.h> /* for memcpy */ | #include <string.h> /* for memcpy */ | ||||
#include "decaf.h" | |||||
#include "secure_buffer.hxx" | |||||
#include <decaf.h> | |||||
#include <decaf/secure_buffer.hxx> | |||||
#include <string> | #include <string> | ||||
#include <sys/types.h> | #include <sys/types.h> | ||||
#include <limits.h> | #include <limits.h> |
@@ -1,5 +1,5 @@ | |||||
/** | /** | ||||
* @file decaf_448.h | |||||
* @file decaf/decaf_448.h | |||||
* @author Mike Hamburg | * @author Mike Hamburg | ||||
* | * | ||||
* @copyright | * @copyright | ||||
@@ -11,7 +11,7 @@ | |||||
#ifndef __DECAF_448_H__ | #ifndef __DECAF_448_H__ | ||||
#define __DECAF_448_H__ 1 | #define __DECAF_448_H__ 1 | ||||
#include "decaf_common.h" | |||||
#include <decaf/common.h> | |||||
#ifdef __cplusplus | #ifdef __cplusplus | ||||
extern "C" { | extern "C" { | ||||
@@ -22,9 +22,9 @@ extern "C" { | |||||
#define DECAF_448_SCALAR_LIMBS (448/DECAF_WORD_BITS) | #define DECAF_448_SCALAR_LIMBS (448/DECAF_WORD_BITS) | ||||
/** Galois field element internal structure */ | /** Galois field element internal structure */ | ||||
typedef struct gf_s { | |||||
typedef struct gf_448_s { | |||||
decaf_word_t limb[DECAF_448_LIMBS]; | decaf_word_t limb[DECAF_448_LIMBS]; | ||||
} __attribute__((aligned(32))) gf_s, gf[1]; | |||||
} __attribute__((aligned(32))) gf_448_s, gf_448_t[1]; | |||||
/** @endcond */ | /** @endcond */ | ||||
/** Number of bytes in a serialized point. */ | /** Number of bytes in a serialized point. */ | ||||
@@ -34,7 +34,7 @@ typedef struct gf_s { | |||||
#define DECAF_448_SCALAR_BYTES 56 | #define DECAF_448_SCALAR_BYTES 56 | ||||
/** Twisted Edwards (-1,d-1) extended homogeneous coordinates */ | /** Twisted Edwards (-1,d-1) extended homogeneous coordinates */ | ||||
typedef struct decaf_448_point_s { /**@cond internal*/gf x,y,z,t;/**@endcond*/ } decaf_448_point_t[1]; | |||||
typedef struct decaf_448_point_s { /**@cond internal*/gf_448_t x,y,z,t;/**@endcond*/ } decaf_448_point_t[1]; | |||||
/** Precomputed table based on a point. Can be trivial implementation. */ | /** Precomputed table based on a point. Can be trivial implementation. */ | ||||
struct decaf_448_precomputed_s; | struct decaf_448_precomputed_s; | ||||
@@ -451,7 +451,7 @@ void decaf_448_point_debugging_torque ( | |||||
* A factor of 2 due to the isogeny. | * A factor of 2 due to the isogeny. | ||||
* A factor of 2 because we quotient out the 2-torsion. | * A factor of 2 because we quotient out the 2-torsion. | ||||
* | * | ||||
* This makes it about 8:1 overall. | |||||
* This makes it about 8:1 overall, or 16:1 overall on curves with cofactor 8. | |||||
* | * | ||||
* Negating the input (mod q) results in the same point. Inverting the input | * Negating the input (mod q) results in the same point. Inverting the input | ||||
* (mod q) results in the negative point. This is the same as Elligator. | * (mod q) results in the negative point. This is the same as Elligator. | ||||
@@ -463,77 +463,76 @@ void decaf_448_point_debugging_torque ( | |||||
* | * | ||||
* @param [in] hashed_data Output of some hash function. | * @param [in] hashed_data Output of some hash function. | ||||
* @param [out] pt The data hashed to the curve. | * @param [out] pt The data hashed to the curve. | ||||
* @return A "hint" value which can be used to help invert the encoding. | |||||
*/ | */ | ||||
unsigned char | |||||
void | |||||
decaf_448_point_from_hash_nonuniform ( | decaf_448_point_from_hash_nonuniform ( | ||||
decaf_448_point_t pt, | decaf_448_point_t pt, | ||||
const unsigned char hashed_data[DECAF_448_SER_BYTES] | const unsigned char hashed_data[DECAF_448_SER_BYTES] | ||||
) API_VIS NONNULL2 NOINLINE; | ) API_VIS NONNULL2 NOINLINE; | ||||
/** | |||||
* @brief Indifferentiable hash function encoding to curve. | |||||
* | |||||
* Equivalent to calling decaf_448_point_from_hash_nonuniform twice and adding. | |||||
* | |||||
* @param [in] hashed_data Output of some hash function. | |||||
* @param [out] pt The data hashed to the curve. | |||||
*/ | |||||
void decaf_448_point_from_hash_uniform ( | |||||
decaf_448_point_t pt, | |||||
const unsigned char hashed_data[2*DECAF_448_SER_BYTES] | |||||
) API_VIS NONNULL2 NOINLINE; | |||||
/** | /** | ||||
* @brief Inverse of elligator-like hash to curve. | * @brief Inverse of elligator-like hash to curve. | ||||
* | * | ||||
* This function writes to the buffer, to make it so that | * This function writes to the buffer, to make it so that | ||||
* decaf_448_point_from_hash_nonuniform(buffer) = pt,hint | |||||
* if possible. | |||||
* decaf_448_point_from_hash_nonuniform(buffer) = pt if | |||||
* possible. Since there may be multiple preimages, the | |||||
* "which" parameter chooses between them. To ensure uniform | |||||
* inverse sampling, this function succeeds or fails | |||||
* independently for different "which" values. | |||||
* | * | ||||
* @param [out] recovered_hash Encoded data. | * @param [out] recovered_hash Encoded data. | ||||
* @param [in] pt The point to encode. | * @param [in] pt The point to encode. | ||||
* @param [in] hint The hint value returned from | |||||
* decaf_448_point_from_hash_nonuniform. | |||||
* @param [in] which A value determining which inverse point | |||||
* to return. | |||||
* | * | ||||
* @retval DECAF_SUCCESS The inverse succeeded. | * @retval DECAF_SUCCESS The inverse succeeded. | ||||
* @retval DECAF_FAILURE The pt isn't the image of | |||||
* decaf_448_point_from_hash_nonuniform with the given hint. | |||||
* @retval DECAF_FAILURE The inverse failed. | |||||
*/ | */ | ||||
decaf_bool_t | decaf_bool_t | ||||
decaf_448_invert_elligator_nonuniform ( | decaf_448_invert_elligator_nonuniform ( | ||||
unsigned char recovered_hash[DECAF_448_SER_BYTES], | unsigned char recovered_hash[DECAF_448_SER_BYTES], | ||||
const decaf_448_point_t pt, | const decaf_448_point_t pt, | ||||
unsigned char hint | |||||
uint16_t which | |||||
) API_VIS NONNULL2 NOINLINE WARN_UNUSED; | ) API_VIS NONNULL2 NOINLINE WARN_UNUSED; | ||||
/** | /** | ||||
* @brief Inverse of elligator-like hash to curve, uniform. | |||||
* @brief Inverse of elligator-like hash to curve. | |||||
* | * | ||||
* This function modifies the first DECAF_448_SER_BYTES of the | |||||
* buffer, to make it so that | |||||
* decaf_448_point_from_hash_uniform(buffer) = pt,hint | |||||
* if possible. | |||||
* This function writes to the buffer, to make it so that | |||||
* decaf_448_point_from_hash_uniform(buffer) = pt if | |||||
* possible. Since there may be multiple preimages, the | |||||
* "which" parameter chooses between them. To ensure uniform | |||||
* inverse sampling, this function succeeds or fails | |||||
* independently for different "which" values. | |||||
* | * | ||||
* @param [out] recovered_hash Encoded data. | * @param [out] recovered_hash Encoded data. | ||||
* @param [in] pt The point to encode. | * @param [in] pt The point to encode. | ||||
* @param [in] hint The hint value returned from | |||||
* decaf_448_point_from_hash_nonuniform. | |||||
* @param [in] which A value determining which inverse point | |||||
* to return. | |||||
* | * | ||||
* @retval DECAF_SUCCESS The inverse succeeded. | * @retval DECAF_SUCCESS The inverse succeeded. | ||||
* @retval DECAF_FAILURE The pt isn't the image of | |||||
* decaf_448_point_from_hash_uniform with the given hint. | |||||
* | |||||
* @warning The hinting system is subject to change, especially in corner cases. | |||||
* @retval DECAF_FAILURE The inverse failed. | |||||
*/ | */ | ||||
decaf_bool_t | decaf_bool_t | ||||
decaf_448_invert_elligator_uniform ( | decaf_448_invert_elligator_uniform ( | ||||
unsigned char recovered_hash[2*DECAF_448_SER_BYTES], | unsigned char recovered_hash[2*DECAF_448_SER_BYTES], | ||||
const decaf_448_point_t pt, | const decaf_448_point_t pt, | ||||
unsigned char hint | |||||
uint16_t which | |||||
) API_VIS NONNULL2 NOINLINE WARN_UNUSED; | ) API_VIS NONNULL2 NOINLINE WARN_UNUSED; | ||||
/** | |||||
* @brief Indifferentiable hash function encoding to curve. | |||||
* | |||||
* Equivalent to calling decaf_448_point_from_hash_nonuniform twice and adding. | |||||
* | |||||
* @param [in] hashed_data Output of some hash function. | |||||
* @param [out] pt The data hashed to the curve. | |||||
* @return A "hint" value which can be used to help invert the encoding. | |||||
*/ | |||||
unsigned char decaf_448_point_from_hash_uniform ( | |||||
decaf_448_point_t pt, | |||||
const unsigned char hashed_data[2*DECAF_448_SER_BYTES] | |||||
) API_VIS NONNULL2 NOINLINE; | |||||
/** | /** | ||||
* @brief Overwrite scalar with zeros. | * @brief Overwrite scalar with zeros. | ||||
*/ | */ |
@@ -1,5 +1,5 @@ | |||||
/** | /** | ||||
* @file decaf_448.hxx | |||||
* @file decaf/decaf_448.hxx | |||||
* @author Mike Hamburg | * @author Mike Hamburg | ||||
* | * | ||||
* @copyright | * @copyright | ||||
@@ -27,7 +27,7 @@ | |||||
#include <stdlib.h> | #include <stdlib.h> | ||||
#include <string.h> /* for memcpy */ | #include <string.h> /* for memcpy */ | ||||
#include "decaf.h" | |||||
#include <decaf.h> | |||||
#include <string> | #include <string> | ||||
#include <sys/types.h> | #include <sys/types.h> | ||||
#include <limits.h> | #include <limits.h> |
@@ -1,5 +1,5 @@ | |||||
/** | /** | ||||
* @file secure_buffer.hxx | |||||
* @file decaf/secure_buffer.hxx | |||||
* @author Mike Hamburg | * @author Mike Hamburg | ||||
* | * | ||||
* @copyright | * @copyright |
@@ -1,5 +1,5 @@ | |||||
/** | /** | ||||
* @file shake.h | |||||
* @file decaf/shake.h | |||||
* @copyright | * @copyright | ||||
* Based on CC0 code by David Leon Gil, 2015 \n | * Based on CC0 code by David Leon Gil, 2015 \n | ||||
* Copyright (c) 2015 Cryptography Research, Inc. \n | * Copyright (c) 2015 Cryptography Research, Inc. \n | ||||
@@ -15,7 +15,7 @@ | |||||
#include <stdint.h> | #include <stdint.h> | ||||
#include <sys/types.h> | #include <sys/types.h> | ||||
#include "decaf_common.h" | |||||
#include <decaf/common.h> | |||||
/** @cond internal */ | /** @cond internal */ | ||||
#define API_VIS __attribute__((visibility("default"))) | #define API_VIS __attribute__((visibility("default"))) |
@@ -1,5 +1,5 @@ | |||||
/** | /** | ||||
* @file shake.hxx | |||||
* @file decaf/shake.hxx | |||||
* @copyright | * @copyright | ||||
* Based on CC0 code by David Leon Gil, 2015 \n | * Based on CC0 code by David Leon Gil, 2015 \n | ||||
* Copyright (c) 2015 Cryptography Research, Inc. \n | * Copyright (c) 2015 Cryptography Research, Inc. \n | ||||
@@ -12,7 +12,7 @@ | |||||
#ifndef __SHAKE_HXX__ | #ifndef __SHAKE_HXX__ | ||||
#define __SHAKE_HXX__ | #define __SHAKE_HXX__ | ||||
#include "shake.h" | |||||
#include <decaf/shake.h> | |||||
#include <string> | #include <string> | ||||
#include <sys/types.h> | #include <sys/types.h> | ||||
@@ -67,7 +67,7 @@ typedef struct keccak_sponge_s { | |||||
} keccak_sponge_t[1]; | } keccak_sponge_t[1]; | ||||
#define INTERNAL_SPONGE_STRUCT 1 | #define INTERNAL_SPONGE_STRUCT 1 | ||||
#include "shake.h" | |||||
#include <decaf/shake.h> | |||||
#define FLAG_ABSORBING 'A' | #define FLAG_ABSORBING 'A' | ||||
#define FLAG_SQUEEZING 'Z' | #define FLAG_SQUEEZING 'Z' | ||||
@@ -8,7 +8,7 @@ | |||||
* @brief Decaf utility functions. | * @brief Decaf utility functions. | ||||
*/ | */ | ||||
#include "decaf_common.h" | |||||
#include <decaf/common.h> | |||||
void decaf_bzero ( | void decaf_bzero ( | ||||
void *s, | void *s, | ||||
@@ -9,10 +9,9 @@ | |||||
* @brief C++ benchmarks, because that's easier. | * @brief C++ benchmarks, because that's easier. | ||||
*/ | */ | ||||
#include "decaf.hxx" | |||||
#include "shake.hxx" | |||||
#include "shake.h" | |||||
#include "decaf_crypto.h" | |||||
#include <decaf.hxx> | |||||
#include <decaf/shake.hxx> | |||||
#include <decaf/crypto.h> | |||||
#include <stdio.h> | #include <stdio.h> | ||||
#include <sys/time.h> | #include <sys/time.h> | ||||
#include <assert.h> | #include <assert.h> | ||||
@@ -11,7 +11,7 @@ | |||||
#include <stdio.h> | #include <stdio.h> | ||||
#include <unistd.h> | #include <unistd.h> | ||||
#include <string.h> | #include <string.h> | ||||
#include "shake.h" | |||||
#include <decaf/shake.h> | |||||
int main(int argc, char **argv) { | int main(int argc, char **argv) { | ||||
(void)argc; (void)argv; | (void)argc; (void)argv; | ||||
@@ -9,9 +9,9 @@ | |||||
* @brief C++ tests, because that's easier. | * @brief C++ tests, because that's easier. | ||||
*/ | */ | ||||
#include "decaf.hxx" | |||||
#include "shake.hxx" | |||||
#include "decaf_crypto.h" | |||||
#include <decaf.hxx> | |||||
#include <decaf/shake.hxx> | |||||
#include <decaf/crypto.h> | |||||
#include <stdio.h> | #include <stdio.h> | ||||