.include <bsd.own.mk>

PROG=	mldsa
SRCS+=	mldsa-main.c
CPPFLAGS+=	-I{$DIST} -I${DIST}/liboqs
MAN=	mldsa.1
WARNS=	5

.sinclude "../../namespace.mk"

# uncomment this to build a 5MB executable, statically linked
#LDSTATIC=	-static

DIST=	${.CURDIR}/../../dist
.PATH: ${DIST}

LIB_MLDSA_DIR!=	cd ${.CURDIR}/../../lib && ${PRINTOBJDIR}
LDADD+=		-L${LIB_MLDSA_DIR} -Wl,-R${LIB_MLDSA_DIR} -lmldsa -lcrypto
DPADD+=		${LIB_MLDSA_DIR}/libmldsa.a

.include <bsd.prog.mk>

t: ${PROG}
	@echo "0. get version number"
	env LD_LIBRARY_PATH=${LIB_MLDSA_DIR} ./${PROG} -V > 0.out 2>&1
	diff 0.expected 0.out
	rm -f 0.out
	@echo "1. Keygen with default key names"
	env LD_LIBRARY_PATH=${LIB_MLDSA_DIR} ./${PROG} keygen > 1.out
	diff 1.expected 1.out
	ls -l ml-dsa-key.*
	rm -f 1.out ml-dsa-key.*
	@echo "2. keygen for named keys"
	env LD_LIBRARY_PATH=${LIB_MLDSA_DIR} ./${PROG} -k test-20260817 keygen > 2.out
	diff 2.expected 2.out
	ls -l test-20260817.*
	rm -f 2.out test-20260817.*
	@echo "3. keygen for more named keys"
	if [ -f 2026Q5-signing-key.pub -o -f 2026Q5-signing-key.sec ]; then \
		rm -f 2026Q5-signing-key.*;				\
	fi
	env LD_LIBRARY_PATH=${LIB_MLDSA_DIR} ./${PROG} -k 2026Q5-signing-key keygen > 3.out
	diff 3.expected 3.out
	ls -l 2026Q5-signing-key.*
	rm -f 3.out
	@echo "4. use sec key to sign something"
	rm -f data.2026Q5-signing-key.sig
	env LD_LIBRARY_PATH=${LIB_MLDSA_DIR} ./${PROG} -k 2026Q5-signing-key sign data > 4.out
	diff 4.expected 4.out
	ls -al data*
	rm -f 4.out
	@echo "5. use pub key to verify the signature"
	ls -al 2026Q5-signing-key.*
	env LD_LIBRARY_PATH=${LIB_MLDSA_DIR} ./${PROG} -k 2026Q5-signing-key verify data > 5.out
	diff 5.expected 5.out
	ls -al data*
	rm -f 5.out
	@echo "6. sign and verify stream data"
	ls -al 2026Q5-signing-key.*
	env LD_LIBRARY_PATH=${LIB_MLDSA_DIR} ./${PROG} -k 2026Q5-signing-key signdata < data > 6embed.out
	env LD_LIBRARY_PATH=${LIB_MLDSA_DIR} ./${PROG} -k 2026Q5-signing-key cat < 6embed.out > 6.out
	ls -al data 6embed.out 6.out
	diff 6.expected 6.out
	rm -f 6.out 6embed.out
	@echo "7. use sec key to sign multiple files"
	rm -f data2
	cp data data2
	env LD_LIBRARY_PATH=${LIB_MLDSA_DIR} ./${PROG} -k 2026Q5-signing-key sign data data2 > 7.out
	diff 7.expected 7.out
	ls -al data*
	@echo "8. verify multiple signatures"
	env LD_LIBRARY_PATH=${LIB_MLDSA_DIR} ./${PROG} -k 2026Q5-signing-key verify data data2 > 8.out
	diff 8.expected 8.out
	ls -al data*
	rm -f 7.out 8.out data2*.sig data2
	@echo "9. sign and verify stream data, embed switch"
	ls -al 2026Q5-signing-key.*
	env LD_LIBRARY_PATH=${LIB_MLDSA_DIR} ./${PROG} -k 2026Q5-signing-key signdata < data > 9embed.out
	env LD_LIBRARY_PATH=${LIB_MLDSA_DIR} ./${PROG} -k 2026Q5-signing-key verifydata < 9embed.out > 9.out
	ls -al data 9embed.out 9.out
	diff 9.expected 9.out
	rm -f 9.out 9embed.out data.2026Q5-signing-key.sig
	@echo "10. bad embedded signature"
	env LD_LIBRARY_PATH=${LIB_MLDSA_DIR} ./${PROG} -k 2026Q5-signing-key verifydata < badsig.embed > 10.out || true
	diff 10.expected 10.out
	rm 10.out
	@echo "11. bad embedded signature"
	env LD_LIBRARY_PATH=${LIB_MLDSA_DIR} ./${PROG} -k 2026Q5-signing-key signdata < data > 11embed.out
	env LD_LIBRARY_PATH=${LIB_MLDSA_DIR} ./${PROG} -k badkey verifydata < 11embed.out > 11.out || true
	diff 11.expected 11.out
	rm -f 11.out 11embed.out
	@echo "12. keygen with no passphrase"
	env LD_LIBRARY_PATH=${LIB_MLDSA_DIR} ./${PROG} -k nopasskey -n keygen > 12.out
	env LD_LIBRARY_PATH=${LIB_MLDSA_DIR} ./${PROG} -k nopasskey sign data > 12a.out
	env LD_LIBRARY_PATH=${LIB_MLDSA_DIR} ./${PROG} -k nopasskey verify data > 12b.out
	ls -al nopasskey.*
	diff 12b.expected 12b.out
	rm -f 12.out 12a.out 12b.out nopasskey.* data.nopasskey.sig
	@echo "13. keygen with no passphrase and streams"
	env LD_LIBRARY_PATH=${LIB_MLDSA_DIR} ./${PROG} -k nopasskey -n keygen > 13.out
	env LD_LIBRARY_PATH=${LIB_MLDSA_DIR} ./${PROG} -k nopasskey signdata < data > 13a.out
	env LD_LIBRARY_PATH=${LIB_MLDSA_DIR} ./${PROG} -k nopasskey verifydata < 13a.out > 13b.out
	hexdump -C nopasskey.sec | sed 20q
	ls -al nopasskey.* 13*.out
	diff data 13b.out
	rm -f 13.out 13a.out 13b.out nopasskey.*
	@echo "14. check sha256 file list"
	sha256 Makefile data 6.expected > list
	env LD_LIBRARY_PATH=${LIB_MLDSA_DIR} ./${PROG} -k nopasskey -n keygen
	env LD_LIBRARY_PATH=${LIB_MLDSA_DIR} ./${PROG} -k nopasskey sign list
	ls -al list*
	env LD_LIBRARY_PATH=${LIB_MLDSA_DIR} ./${PROG} -k nopasskey check list > 14.out
	diff 14.expected 14.out
	rm -f 14.out nopasskey.* list list.nopasskey.sig
