all: KeccakReference KeccakOptimized32 KeccakOptimized64

SOURCES_COMMON = \
    Sources/genKAT.c \
    Sources/KeccakSponge.c

SOURCES_REFERENCE = \
    $(SOURCES_COMMON) \
    Sources/displayIntermediateValues.c \
    Sources/KeccakPermutationReference.c \
    Sources/mainReference.c

SOURCES_OPTIMIZED = \
    $(SOURCES_COMMON) \
    Sources/mainOptimized.c \
    Sources/timing.c

SOURCES_OPTIMIZED_32 = \
    $(SOURCES_OPTIMIZED) \
    Sources/KeccakPermutationOptimized32.c

SOURCES_OPTIMIZED_64 = \
    $(SOURCES_OPTIMIZED) \
    Sources/KeccakPermutationOptimized64.c

HEADERS_COMMON = \
    Sources/KeccakNISTInterface.h \
    Sources/KeccakPermutationInterface.h

HEADERS_REFERENCE = \
    $(HEADERS_COMMON) \
    Sources/displayIntermediateValues.h \
    Sources/KeccakPermutationReference.h

HEADERS_OPTIMIZED = \
    $(HEADERS_COMMON) \
    Sources/timing.h \
    Sources/brg_endian.h

HEADERS_OPTIMIZED_32 = \
    $(HEADERS_OPTIMIZED) \
    Sources/KeccakPermutationOptimized32.macros

HEADERS_OPTIMIZED_64 = \
    $(HEADERS_OPTIMIZED) \
    Sources/KeccakPermutationOptimized64.macros

BINDIR_REFERENCE = bin/reference

$(BINDIR_REFERENCE):
	mkdir -p $(BINDIR_REFERENCE)

BINDIR_OPTIMIZED_32 = bin/optimized32

$(BINDIR_OPTIMIZED_32):
	mkdir -p $(BINDIR_OPTIMIZED_32)

BINDIR_OPTIMIZED_64 = bin/optimized64

$(BINDIR_OPTIMIZED_64):
	mkdir -p $(BINDIR_OPTIMIZED_64)

OBJECTS_REFERENCE = $(addprefix $(BINDIR_REFERENCE)/, $(notdir $(patsubst %.c,%.o,$(SOURCES_REFERENCE))))

OBJECTS_OPTIMIZED_32 = $(addprefix $(BINDIR_OPTIMIZED_32)/, $(notdir $(patsubst %.c,%.o,$(SOURCES_OPTIMIZED_32))))

OBJECTS_OPTIMIZED_64 = $(addprefix $(BINDIR_OPTIMIZED_64)/, $(notdir $(patsubst %.c,%.o,$(SOURCES_OPTIMIZED_64))))

CFLAGS_REFERENCE = -DKeccakReference

CFLAGS_OPTIMIZED_32 = -save-temps -O3 -g0 -m32

CFLAGS_OPTIMIZED_64 = -save-temps -O3 -g0 -march=nocona

VPATH = Sources

INCLUDES = -ISources

$(BINDIR_REFERENCE)/%.o:%.c $(HEADERS_REFERENCE)
	$(CC) $(INCLUDES) $(CFLAGS_REFERENCE) -c $< -o $@

$(BINDIR_OPTIMIZED_32)/%.o:%.c $(HEADERS_OPTIMIZED_32)
	$(CC) $(INCLUDES) $(CFLAGS_OPTIMIZED_32) -c $< -o $@

$(BINDIR_OPTIMIZED_64)/%.o:%.c $(HEADERS_OPTIMIZED_64)
	$(CC) $(INCLUDES) $(CFLAGS_OPTIMIZED_64) -c $< -o $@

.PHONY: KeccakReference KeccakOptimized32 KeccakOptimized64

KeccakReference: bin/KeccakReference

bin/KeccakReference:  $(BINDIR_REFERENCE) $(OBJECTS_REFERENCE)  $(HEADERS_REFERENCE)
	$(CC) $(CFLAGS_REFERENCE) -o $@ $(OBJECTS_REFERENCE)

KeccakOptimized32: bin/KeccakOptimized32

bin/KeccakOptimized32:  $(BINDIR_OPTIMIZED_32) $(OBJECTS_OPTIMIZED_32)  $(HEADERS_OPTIMIZED_32)
	$(CC) $(CFLAGS_OPTIMIZED_32) -o $@ $(OBJECTS_OPTIMIZED_32)

KeccakOptimized64: bin/KeccakOptimized64

bin/KeccakOptimized64:  $(BINDIR_OPTIMIZED_64) $(OBJECTS_OPTIMIZED_64)  $(HEADERS_OPTIMIZED_64)
	$(CC) $(CFLAGS_OPTIMIZED_64) -o $@ $(OBJECTS_OPTIMIZED_64)

.PHONY: clean

clean:
	rm -rf bin/

FILES_EBASH_COMMON = \
    eBash/hash.c \
    Sources/brg_endian.h \
    Sources/KeccakSponge.c \
    Sources/KeccakNISTInterface.h \
    Sources/KeccakPermutationInterface.h

FILES_EBASH_OPT32 = \
    $(FILES_EBASH_COMMON) \
    Sources/KeccakPermutationOptimized32.c \
    Sources/KeccakPermutationOptimized32.macros

FILES_EBASH_OPT64 = \
    $(FILES_EBASH_COMMON) \
    Sources/KeccakPermutationOptimized64.c \
    Sources/KeccakPermutationOptimized64.macros

.PHONY: eBash keccakr1024c576-opt32 keccakr1024c576-opt64

keccakr1024c576-opt32: $(FILES_EBASH_OPT32) eBash/api-keccakr1024c576.h
	mkdir -p eBash/crypto_hash/keccakr1024c576/opt32
	cp -p $(FILES_EBASH_OPT32) eBash/crypto_hash/keccakr1024c576/opt32/
	cp -p eBash/api-keccakr1024c576.h eBash/crypto_hash/keccakr1024c576/opt32/api.h

keccakr1024c576-opt64: $(FILES_EBASH_OPT64) eBash/api-keccakr1024c576.h
	mkdir -p eBash/crypto_hash/keccakr1024c576/opt64
	cp -p $(FILES_EBASH_OPT64) eBash/crypto_hash/keccakr1024c576/opt64/
	cp -p eBash/api-keccakr1024c576.h eBash/crypto_hash/keccakr1024c576/opt64/api.h

eBash: eBash/keccakr1024c576.tar.gz

eBash/keccakr1024c576.tar.gz: keccakr1024c576-opt32 keccakr1024c576-opt64
	cd eBash ; tar -cvzf keccakr1024c576.tar.gz crypto_hash/
