# Makefile for Win32 platform using Microsoft Visual C++
SRC       = .
OS        = win64_vc
#
CC        = CL
RC        = RC
LINK      = LINK
#
CFLAGS    = /nologo /W3 /O2 /Ox /D "NDEBUG" -I$(SRC)
#
DEFS      = -D_CRT_SECURE_NO_WARNINGS  # -DWIN64 -DASM 
#
ALGO      = krypt
CIPHER    = cipher
TESTVK    = testvk
TESTVT    = testvt
BENCH     = bench
TABLES    = tables
TEST      = test
RM        = del
DIFF      = comp
#
TESTS     = .
#
ALIBS     = LIBCMT.LIB $(ALGO).LIB
DLIBS     = LIBCMT.LIB
#
LINKD     = $(LINK) $(DLIBS) /NOLOGO /RELEASE /SUBSYSTEM:CONSOLE /MACHINE:X64 /DLL
LINKA     = $(LINK) $(ALIBS) /NOLOGO /RELEASE /SUBSYSTEM:CONSOLE /MACHINE:X64

#
all: $(TESTVK) $(TESTVT) $(CIPHER) $(TEST) $(BENCH)
#

$(TESTVK): $@.obj $(ALGO).lib
	@echo Building $@
	@$(LINKA) /OUT:$@.exe $@.obj

$(TESTVK).obj:  $(SRC)\$(TESTVK).c  $(SRC)\$(ALGO).h
	$(CC) $(CFLAGS) $(DEFS) /Fo$@ /c $(SRC)\$(TESTVK).c

$(TESTVT): $(TESTVT).obj $(ALGO).lib
	@echo Building $@
	@$(LINKA) /OUT:$@.exe $@.obj

$(TESTVT).obj:  $(SRC)\$(TESTVT).c  $(SRC)\$(ALGO).h
	@$(CC) $(CFLAGS) $(DEFS) /Fo$@ /c $(SRC)\$(TESTVT).c

$(BENCH): $@.obj $(ALGO).lib
	@echo Building $@
	@$(LINKA) /OUT:$@.exe $@.obj

$(BENCH).obj: $(SRC)\$(BENCH).c $(SRC)\$(ALGO).h
	@$(CC) $(CFLAGS) $(DEFS) /Fo$@ /c $(SRC)\$(BENCH).c

$(CIPHER): $@.obj $(ALGO).lib
	@echo Building $@
	@$(LINKA) /OUT:$@.exe $@.obj

$(CIPHER).obj: $(SRC)\$(CIPHER).c  $(SRC)\$(ALGO).h
	@$(CC) $(CFLAGS) $(DEFS) /Fo$@ /c $(SRC)\$(CIPHER).c

test:   $(CIPHER)
	@echo Testing Blowfish ...
	@echo Electronic Code Book (ECB) Mode ...
	@.\$(CIPHER) -a blowfish -m ecb -k sesam -q $(TESTS)\test.txt test.ecb
	@.\$(CIPHER) -d -a blowfish -m ecb -k sesam -q test.ecb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.ecb
	@echo Cipher Block Chaining (CBC) Mode ...
	@.\$(CIPHER) -a blowfish -m cbc -k sesam -q $(TESTS)\test.txt test.cbc
	@.\$(CIPHER) -d -a blowfish -m cbc -k sesam -q test.cbc test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.cbc
	@echo 8 Bit Output Feedback (OFB) Mode ...
	@.\$(CIPHER) -a blowfish -m ofb -k sesam -q $(TESTS)\test.txt test.ofb
	@.\$(CIPHER) -d -a blowfish -m ofb -k sesam -q test.ofb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.ofb
	@echo 8 Bit Cipher Feedback (CFB) Mode ...
	@.\$(CIPHER) -a blowfish -m cfb -k sesam -q $(TESTS)\test.txt test.cfb
	@.\$(CIPHER) -d -a blowfish -m cfb -k sesam -q test.cfb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.cfb
	@echo Testing Cast-128 ...
	@echo Electronic Code Book (ECB) Mode ...
	@.\$(CIPHER) -a cast128 -m ecb -k sesam -q $(TESTS)\test.txt test.ecb
	@.\$(CIPHER) -d -a cast128 -m ecb -k sesam -q test.ecb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.ecb
	@echo Cipher Block Chaining (CBC) Mode ...
	@.\$(CIPHER) -a cast128 -m cbc -k sesam -q $(TESTS)\test.txt test.cbc
	@.\$(CIPHER) -d -a cast128 -m cbc -k sesam -q test.cbc test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.cbc
	@echo 8 Bit Output Feedback (OFB) Mode ...
	@.\$(CIPHER) -a cast128 -m ofb -k sesam -q $(TESTS)\test.txt test.ofb
	@.\$(CIPHER) -d -a cast128 -m ofb -k sesam -q test.ofb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.ofb
	@echo 8 Bit Cipher Feedback (CFB) Mode ...
	@.\$(CIPHER) -a cast128 -m cfb -k sesam -q $(TESTS)\test.txt test.cfb
	@.\$(CIPHER) -d -a cast128 -m cfb -k sesam -q test.cfb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.cfb
	@echo Testing DES3 EDE ...
	@echo Electronic Code Book (ECB) Mode ...
	@.\$(CIPHER) -a des3ede -m ecb -k sesam -q $(TESTS)\test.txt test.ecb
	@.\$(CIPHER) -d -a des3ede -m ecb -k sesam -q test.ecb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.ecb
	@echo Cipher Block Chaining (CBC) Mode ...
	@.\$(CIPHER) -a des3ede -m cbc -k sesam -q $(TESTS)\test.txt test.cbc
	@.\$(CIPHER) -d -a des3ede -m cbc -k sesam -q test.cbc test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.cbc
	@echo 8 Bit Output Feedback (OFB) Mode ...
	@.\$(CIPHER) -a des3ede -m ofb -k sesam -q $(TESTS)\test.txt test.ofb
	@.\$(CIPHER) -d -a des3ede -m ofb -k sesam -q test.ofb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.ofb
	@echo 8 Bit Cipher Feedback (CFB) Mode ...
	@.\$(CIPHER) -a des3ede -m cfb -k sesam -q $(TESTS)\test.txt test.cfb
	@.\$(CIPHER) -d -a des3ede -m cfb -k sesam -q test.cfb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.cfb
	@echo Testing DES3 EEE ...
	@echo Electronic Code Book (ECB) Mode ...
	@.\$(CIPHER) -a des3eee -m ecb -k sesam -q $(TESTS)\test.txt test.ecb
	@.\$(CIPHER) -d -a des3eee -m ecb -k sesam -q test.ecb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.ecb
	@echo Cipher Block Chaining (CBC) Mode ...
	@.\$(CIPHER) -a des3eee -m cbc -k sesam -q $(TESTS)\test.txt test.cbc
	@.\$(CIPHER) -d -a des3eee -m cbc -k sesam -q test.cbc test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.cbc
	@echo 8 Bit Output Feedback (OFB) Mode ...
	@.\$(CIPHER) -a des3eee -m ofb -k sesam -q $(TESTS)\test.txt test.ofb
	@.\$(CIPHER) -d -a des3eee -m ofb -k sesam -q test.ofb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.ofb
	@echo 8 Bit Cipher Feedback (CFB) Mode ...
	@.\$(CIPHER) -a des3eee -m cfb -k sesam -q $(TESTS)\test.txt test.cfb
	@.\$(CIPHER) -d -a des3eee -m cfb -k sesam -q test.cfb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.cfb
	@echo Testing DES ...
	@echo Electronic Code Book (ECB) Mode ...
	@.\$(CIPHER) -a des -m ecb -k sesam -q $(TESTS)\test.txt test.ecb
	@.\$(CIPHER) -d -a des -m ecb -k sesam -q test.ecb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.ecb
	@echo Cipher Block Chaining (CBC) Mode ...
	@.\$(CIPHER) -a des -m cbc -k sesam -q $(TESTS)\test.txt test.cbc
	@.\$(CIPHER) -d -a des -m cbc -k sesam -q test.cbc test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.cbc
	@echo 8 Bit Output Feedback (OFB) Mode ...
	@.\$(CIPHER) -a des -m ofb -k sesam -q $(TESTS)\test.txt test.ofb
	@.\$(CIPHER) -d -a des -m ofb -k sesam -q test.ofb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.ofb
	@echo 8 Bit Cipher Feedback (CFB) Mode ...
	@.\$(CIPHER) -a des -m cfb -k sesam -q $(TESTS)\test.txt test.cfb
	@.\$(CIPHER) -d -a des -m cfb -k sesam -q test.cfb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.cfb
	@echo Testing Mars ...
	@echo Electronic Code Book (ECB) Mode ...
	@.\$(CIPHER) -a mars -m ecb -k sesam -q $(TESTS)\test.txt test.ecb
	@.\$(CIPHER) -d -a mars -m ecb -k sesam -q test.ecb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.ecb
	@echo Cipher Block Chaining (CBC) Mode ...
	@.\$(CIPHER) -a mars -m cbc -k sesam -q $(TESTS)\test.txt test.cbc
	@.\$(CIPHER) -d -a mars -m cbc -k sesam -q test.cbc test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.cbc
	@echo 8 Bit Output Feedback (OFB) Mode ...
	@.\$(CIPHER) -a mars -m ofb -k sesam -q $(TESTS)\test.txt test.ofb
	@.\$(CIPHER) -d -a mars -m ofb -k sesam -q test.ofb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.ofb
	@echo 8 Bit Cipher Feedback (CFB) Mode ...
	@.\$(CIPHER) -a mars -m cfb -k sesam -q $(TESTS)\test.txt test.cfb
	@.\$(CIPHER) -d -a mars -m cfb -k sesam -q test.cfb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.cfb
	@echo Testing Rijndael ...
	@echo Electronic Code Book (ECB) Mode ...
	@.\$(CIPHER) -a rijndael -m ecb -k sesam -q $(TESTS)\test.txt test.ecb
	@.\$(CIPHER) -d -a rijndael -m ecb -k sesam -q test.ecb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.ecb
	@echo Cipher Block Chaining (CBC) Mode ...
	@.\$(CIPHER) -a rijndael -m cbc -k sesam -q $(TESTS)\test.txt test.cbc
	@.\$(CIPHER) -d -a rijndael -m cbc -k sesam -q test.cbc test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.cbc
	@echo 8 Bit Output Feedback (OFB) Mode ...
	@.\$(CIPHER) -a rijndael -m ofb -k sesam -q $(TESTS)\test.txt test.ofb
	@.\$(CIPHER) -d -a rijndael -m ofb -k sesam -q test.ofb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.ofb
	@echo 8 Bit Cipher Feedback (CFB) Mode ...
	@.\$(CIPHER) -a rijndael -m cfb -k sesam -q $(TESTS)\test.txt test.cfb
	@.\$(CIPHER) -d -a rijndael -m cfb -k sesam -q test.cfb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.cfb
	@echo Testing Safer+ ...
	@echo Electronic Code Book (ECB) Mode ...
	@.\$(CIPHER) -a safer -m ecb -k sesam -q $(TESTS)\test.txt test.ecb
	@.\$(CIPHER) -d -a safer -m ecb -k sesam -q test.ecb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.ecb
	@echo Cipher Block Chaining (CBC) Mode ...
	@.\$(CIPHER) -a safer -m cbc -k sesam -q $(TESTS)\test.txt test.cbc
	@.\$(CIPHER) -d -a safer -m cbc -k sesam -q test.cbc test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.cbc
	@echo 8 Bit Output Feedback (OFB) Mode ...
	@.\$(CIPHER) -a safer -m ofb -k sesam -q $(TESTS)\test.txt test.ofb
	@.\$(CIPHER) -d -a safer -m ofb -k sesam -q test.ofb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.ofb
	@echo 8 Bit Cipher Feedback (CFB) Mode ...
	@.\$(CIPHER) -a safer -m cfb -k sesam -q $(TESTS)\test.txt test.cfb
	@.\$(CIPHER) -d -a safer -m cfb -k sesam -q test.cfb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.cfb
	@echo Testing Serpent ...
	@echo Electronic Code Book (ECB) Mode ...
	@.\$(CIPHER) -a serpent -m ecb -k sesam -q $(TESTS)\test.txt test.ecb
	@.\$(CIPHER) -d -a serpent -m ecb -k sesam -q test.ecb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.ecb
	@echo Cipher Block Chaining (CBC) Mode ...
	@.\$(CIPHER) -a serpent -m cbc -k sesam -q $(TESTS)\test.txt test.cbc
	@.\$(CIPHER) -d -a serpent -m cbc -k sesam -q test.cbc test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.cbc
	@echo 8 Bit Output Feedback (OFB) Mode ...
	@.\$(CIPHER) -a serpent -m ofb -k sesam -q $(TESTS)\test.txt test.ofb
	@.\$(CIPHER) -d -a serpent -m ofb -k sesam -q test.ofb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.ofb
	@echo 8 Bit Cipher Feedback (CFB) Mode ...
	@.\$(CIPHER) -a serpent -m cfb -k sesam -q $(TESTS)\test.txt test.cfb
	@.\$(CIPHER) -d -a serpent -m cfb -k sesam -q test.cfb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.cfb
	@echo Testing Twofish ...
	@echo Electronic Code Book (ECB) Mode ...
	@.\$(CIPHER) -a twofish -m ecb -k sesam -q $(TESTS)\test.txt test.ecb
	@.\$(CIPHER) -d -a twofish -m ecb -k sesam -q test.ecb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.ecb
	@echo Cipher Block Chaining (CBC) Mode ...
	@.\$(CIPHER) -a twofish -m cbc -k sesam -q $(TESTS)\test.txt test.cbc
	@.\$(CIPHER) -d -a twofish -m cbc -k sesam -q test.cbc test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.cbc
	@echo 8 Bit Output Feedback (OFB) Mode ...
	@.\$(CIPHER) -a twofish -m ofb -k sesam -q $(TESTS)\test.txt test.ofb
	@.\$(CIPHER) -d -a twofish -m ofb -k sesam -q test.ofb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.ofb
	@echo 8 Bit Cipher Feedback (CFB) Mode ...
	@.\$(CIPHER) -a twofish -m cfb -k sesam -q $(TESTS)\test.txt test.cfb
	@.\$(CIPHER) -d -a twofish -m cfb -k sesam -q test.cfb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.cfb
	@echo Testing Cast-256 ...
	@echo Electronic Code Book (ECB) Mode ...
	@.\$(CIPHER) -a cast256 -m ecb -k sesam -q $(TESTS)\test.txt test.ecb
	@.\$(CIPHER) -d -a cast256 -m ecb -k sesam -q test.ecb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.ecb
	@echo Cipher Block Chaining (CBC) Mode ...
	@.\$(CIPHER) -a cast256 -m cbc -k sesam -q $(TESTS)\test.txt test.cbc
	@.\$(CIPHER) -d -a cast256 -m cbc -k sesam -q test.cbc test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.cbc
	@echo 8 Bit Output Feedback (OFB) Mode ...
	@.\$(CIPHER) -a cast256 -m ofb -k sesam -q $(TESTS)\test.txt test.ofb
	@.\$(CIPHER) -d -a cast256 -m ofb -k sesam -q test.ofb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.ofb
	@echo 8 Bit Cipher Feedback (CFB) Mode ...
	@.\$(CIPHER) -a cast256 -m cfb -k sesam -q $(TESTS)\test.txt test.cfb
	@.\$(CIPHER) -d -a cast256 -m cfb -k sesam -q test.cfb test.out
	@$(DIFF) $(TESTS)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.cfb
	@echo "Build successful :-)"

#
clean:
	@if exist *.map del *.map
	@if exist *.obj del *.obj
	@if exist *.res del *.res
	@if exist *.exp del *.exp
	@if exist *.exe del *.exe
	@if exist *.bak del *.bak
	@if exist *.zip del *.zip

zip:
	@zip -X $(ALGO)_$(OS).zip *.*

