-PRG = serpent-test
-#PRG = tdes-test
-# camellia
-# cryptotest
-SERPENT_OBJ = main-serpent-test.o debug.o uart.o serial-tools.o serpent.o
-CAMELLIA_OBJ = main-camellia-test.o debug.o uart.o serial-tools.o camellia.o camellia-asm.o
-SKIPJACK_OBJ = main-skipjack-test.o debug.o uart.o serial-tools.o skipjack.o
-SHA1_OBJ = main-sha1-test.o debug.o uart.o serial-tools.o sha1-asm.o
-MD5_OBJ = main-md5-test.o debug.o uart.o serial-tools.o md5.o
-CAST5_OBJ = main-cast5-test.o debug.o uart.o serial-tools.o cast5.o
-RC6_OBJ = main-rc6-test.o debug.o uart.o serial-tools.o rc6.o
-Multi_OBJ = main.o debug.o uart.o serial-tools.o sha256-asm.o xtea-asm.o arcfour-asm.o prng.o cast5.o
-DES_OBJ = main-des-test.o debug.o uart.o serial-tools.o des.o
-TDES_OBJ = main-tdes-test.o debug.o uart.o serial-tools.o des.o
-SEED_OBJ = main-seed-test.o debug.o uart.o serial-tools.o seed.o seed-asm.o
-SHABEA_OBJ = main-shabea-test.o debug.o uart.o serial-tools.o shabea.o sha256-asm.o
+# Makefile for the micro-crypt project
+# author: Daniel Otte
+
+BLOCK_CIPHERS :=
+STREAM_CIPHERS :=
+HASHES :=
+MACS :=
+PRNGS :=
+
+# we use the gnu make standard library
+include gmsl
+include avr-makefile.inc
+include mkfiles/*.mk
+
+ALGORITHMS = $(BLOCK_CIPHERS) $(STREAM_CIPHERS) $(HASHES) $(PRNGS) $(MACS)
+ALGORITHMS_OBJ = $(patsubst %,%_OBJ, $(ALGORITHMS))
+ALGORITHMS_TEST_BIN = $(patsubst %,%_TEST_BIN, $(ALGORITHMS))
+
+define OBJinBINDIR_TEMPLATE
+$(1) = $(2)
+endef
+
+$(foreach a, $(ALGORITHMS_OBJ), $(eval $(call OBJinBINDIR_TEMPLATE, $(a), $(patsubst %.o,$(BIN_DIR)%.o,$($(a))))))
+
+$(foreach a, $(ALGORITHMS_TEST_BIN), $(eval $(call OBJinBINDIR_TEMPLATE, $(a), $(patsubst %.o,$(TESTBIN_DIR)%.o,$($(a))))))
+
+
+#ALGORITHMS_TEST_BIN_IMM = $(foreach a, $(ALGORITHMS_TEST_BIN), $($(a)))
+ALGORITHMS_NESSIE_TEST = $(patsubst %,%_NESSIE_TEST, $(ALGORITHMS))
+ALGORITHMS_PERFORMANCE_TEST = $(patsubst %,%_PERORMANCE_TEST, $(ALGORITHMS))
+
+ALGORITHMS_LC = $(call lc,$(ALGORITHMS))
+
+ALGORITHMS_TEST_TARGET_ELF = $(patsubst %, $(TESTBIN_DIR)main-%-test.elf, $(ALGORITHMS_LC))
+ALGORITHMS_TEST_TARGET_HEX = $(patsubst %, $(TESTBIN_DIR)main-%-test.hex, $(ALGORITHMS_LC))
+
+
+#-------------------------------------------------------------------------------
+
+all: $(foreach algo, $(ALGORITHMS), $(algo)_OBJ)
+
+#-------------------------------------------------------------------------------
+
+define MAIN_OBJ_TEMPLATE
+$(2): $(3) $(4)
+ @echo "[ld]: $$@"
+# echo $$^
+ @$(CC) $(CFLAGS) $(LDFLAGS)$(patsubst %.elf,%.map,$(2)) -o \
+ $(2) \
+ $(3) $(4) \
+ $(LIBS)
+endef
+
+$(foreach algo, $(ALGORITHMS), $(eval $(call MAIN_OBJ_TEMPLATE, \
+ $(algo), \
+ $(TESTBIN_DIR)main-$(call lc,$(algo))-test.elf, \
+ $(patsubst %.o,%.o,$($(algo)_TEST_BIN)), \
+ $(patsubst %.o,%.o,$($(algo)_OBJ)) )))
+
+
+
+
+#-------------------------------------------------------------------------------
+.PHONY: help
+help: info
+
+info:
+ @echo "infos on micro-crypt:"
+ @echo " block ciphers:"
+ @echo " $(BLOCK_CIPHERS)"
+ @echo " stream ciphers:"
+ @echo " $(STREAM_CIPHERS)"
+ @echo " hash functions:"
+ @echo " $(HASHES)"
+ @echo " MAC functions:"
+ @echo " $(MACS)"
+ @echo " PRNG functions:"
+ @echo " $(PRNGS)"
+# @echo " ALGORITHMS_TEST_BIN:"
+# @echo " $(ALGORITHMS_TEST_BIN)"
+# @echo " ALGORITHMS_TEST_TARGET_ELF:"
+# @echo " $(ALGORITHMS_TEST_TARGET_ELF)"
+ @echo " targets:"
+ @echo " all - all algorithm cores"
+ @echo " cores - all algorithm cores"
+ @echo " listings - all algorithm core listings"
+ @echo " tests - all algorithm test programs"
+ @echo " stats - all algorithm size statistics"
+ @echo " blockciphers - all blockcipher cores"
+ @echo " streamciphers - all streamcipher cores"
+ @echo " hashes - all hash cores"
+ @echo " macs - all MAC cores"
+ @echo " prngs - all PRNG cores"
+ @echo " all_testrun - testrun all algorithms"
+ @echo " docu - build doxygen documentation"
+ @echo " clean - remove a lot of builded files"
+ @echo " xclean - also remove dependency files"
+ @echo " *_TEST_BIN - build test program"
+ @echo " *_TESTRUN - run nessie test"
+ @echo " *_OBJ - build algorithm core"
+ @echo " *_FLASH - flash test program"
+ @echo " *_LIST - build assembler listing"
+
+#-------------------------------------------------------------------------------
+