From 30168129191c95cde6ee2b24490e15f0366edfc3 Mon Sep 17 00:00:00 2001 From: K1 Date: Mon, 29 Jan 2024 20:54:20 +0800 Subject: [PATCH] Add ascon_gen_kat Generate ascon kat test cases by ascon_gen_kat, including ascon_hash.txt, ascon_hasha.txt, ascon_aead128.txt, ascon_aead128a.txt, ascon_hmac.txt and ascon_hmaca.txt. --- test/ascon_gen_kat.c | 201 ++++++++++++++++++ test/test_ascon_aead.py | 4 +- .../{ascon128_aead.txt => ascon_aead128.txt} | 4 +- ...{ascon128a_aead.txt => ascon_aead128a.txt} | 4 +- test/test_ascon_data/ascon_hash.txt | 2 +- test/test_ascon_data/ascon_hasha.txt | 3 +- test/test_hmac_data/ascon_hmac.txt | 2 + test/test_hmac_data/ascon_hmaca.txt | 1 + 8 files changed, 213 insertions(+), 8 deletions(-) create mode 100644 test/ascon_gen_kat.c rename test/test_ascon_data/{ascon128_aead.txt => ascon_aead128.txt} (99%) rename test/test_ascon_data/{ascon128a_aead.txt => ascon_aead128a.txt} (99%) diff --git a/test/ascon_gen_kat.c b/test/ascon_gen_kat.c new file mode 100644 index 0000000..7c5fe73 --- /dev/null +++ b/test/ascon_gen_kat.c @@ -0,0 +1,201 @@ +/* + * Copyright 2023 The Tongsuo Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://github.com/Tongsuo-Project/tongsuo-mini/blob/main/LICENSE + */ + +#include +#include +#include +#include +#include +#include + +static int gen_aead(FILE *fp, int scheme) +{ + unsigned char key[TSM_ASCON_AEAD_KEY_LEN]; + unsigned char iv[TSM_ASCON_AEAD_IV_LEN]; + unsigned char pt[32]; + unsigned char ad[32]; + unsigned char ct[1024]; + unsigned char tag[TSM_ASCON_AEAD_TAG_LEN]; + size_t outl; + int i, j, k, cnt = 0; + + for (i = 0; i < sizeof(key); i++) { + key[i] = i; + } + for (i = 0; i < sizeof(iv); i++) { + iv[i] = i; + } + for (i = 0; i < sizeof(pt); i++) { + pt[i] = i; + } + for (i = 0; i < sizeof(ad); i++) { + ad[i] = i; + } + + fprintf(fp, "# Generated by ascon_gen_kat\n"); + + for (i = 0; i <= sizeof(pt); i++) { + for (j = 0; j <= sizeof(ad); j++) { + fprintf(fp, "Count = %d\n", ++cnt); + + fprintf(fp, "Key = "); + for (k = 0; k < sizeof(key); k++) { + fprintf(fp, "%02X", key[k]); + } + + fprintf(fp, "\nNonce = "); + for (k = 0; k < sizeof(iv); k++) { + fprintf(fp, "%02X", iv[k]); + } + + fprintf(fp, "\nPT = "); + for (k = 0; k < i; k++) { + fprintf(fp, "%02X", pt[k]); + } + + fprintf(fp, "\nAD = "); + for (k = 0; k < j; k++) { + fprintf(fp, "%02X", ad[k]); + } + + fprintf(fp, "\nCT = "); + if (tsm_ascon_aead_oneshot(scheme, key, iv, ad, j, pt, i, ct, &outl, TSM_CIPH_FLAG_ENCRYPT) != TSM_OK) { + fprintf(stderr, "Error: could not encrypt\n"); + return 0; + } + for (k = 0; k < outl; k++) { + fprintf(fp, "%02X", ct[k]); + } + + fprintf(fp, "\n\n"); + } + } + + return 1; +} + +static int gen_hash(FILE *fp, int scheme) +{ + unsigned int i, j, cnt = 0; + unsigned char buf[1024]; + unsigned char hash[TSM_ASCON_HASH_LEN]; + size_t outl; + + for (i = 0; i < sizeof(buf); i++) { + buf[i] = i & 0xff; + } + + fprintf(fp, "# Generated by ascon_gen_kat\n"); + for (i = 0; i <= sizeof(buf); i++) { + fprintf(fp, "Count = %u\n", i + 1); + + fprintf(fp, "Msg = "); + for (j = 0; j < i; j++) { + fprintf(fp, "%02X", buf[j]); + } + fprintf(fp, "\n"); + + if (tsm_ascon_hash_oneshot(scheme, buf, i, hash, &outl) != TSM_OK) { + fprintf(stderr, "Error: could not generate hash\n"); + return 0; + } + + fprintf(fp, "MD = "); + for (j = 0; j < TSM_ASCON_HASH_LEN; j++) { + fprintf(fp, "%02X", hash[j]); + } + + fprintf(fp, "\n\n"); + } + + return 1; +} + +static int gen_hmac(FILE *fp, int hash) +{ + unsigned char msg[1024]; + unsigned char key[32]; + unsigned char buf[TSM_ASCON_HMAC_LEN]; + size_t outlen; + int i; + + fprintf(fp, "# Generated by ascon_gen_kat\n"); + + for (i = 0; i < sizeof(key); i++) { + key[i] = i; + } + + for (i = 0; i < sizeof(msg); i++) { + msg[i] = i & 0xff; + } + + for (i = 0; i <= sizeof(msg); i++) { + fprintf(fp, "Count = %d\n", i + 1); + + fprintf(fp, "Key = "); + for (int j = 0; j < sizeof(key); j++) { + fprintf(fp, "%02X", key[j]); + } + + fprintf(fp, "\nMsg = "); + for (int j = 0; j < i; j++) { + fprintf(fp, "%02X", msg[j]); + } + + fprintf(fp, "\nTag = "); + if (tsm_hmac_oneshot(hash, key, sizeof(key), msg, i, buf, &outlen) != TSM_OK) { + fprintf(stderr, "Error: could not generate HMAC\n"); + return 0; + } + for (int j = 0; j < outlen; j++) { + fprintf(fp, "%02X", buf[j]); + } + + fprintf(fp, "\n\n"); + } + + return 1; +} + +int main(int argc, char **argv) +{ + int ret = 0; + + if (argc != 2) { + fprintf(stderr, "Usage: %s [-hash|-hasha|-aead128|-aead128a|-hmac|-hmaca]\n", argv[0]); + exit(EXIT_FAILURE); + } + + if (strcmp(argv[1], "-hash") == 0) { + ret = gen_hash(stdout, TSM_HASH_ASCON_HASH); + } else if (strcmp(argv[1], "-hasha") == 0) { + ret = gen_hash(stdout, TSM_HASH_ASCON_HASHA); + } else if (strcmp(argv[1], "-aead128") == 0) { + ret = gen_aead(stdout, TSM_ASCON_AEAD_128); + } else if (strcmp(argv[1], "-aead128a") == 0) { + ret = gen_aead(stdout, TSM_ASCON_AEAD_128A); + } else if (strcmp(argv[1], "-hmac") == 0) { + ret = gen_hmac(stdout, TSM_HASH_ASCON_HASH); + } else if (strcmp(argv[1], "-hmaca") == 0) { + ret = gen_hmac(stdout, TSM_HASH_ASCON_HASHA); + } else { + fprintf(stderr, "Error: invalid argument %s\n", argv[1]); + exit(EXIT_FAILURE); + } + + if (ret == 0) { + fprintf(stderr, "Error: could not generate KAT\n"); + exit(EXIT_FAILURE); + } + + return 0; +} + +// cc ascon_gen_kat.c ../build/libtongsuo-mini.a -o ascon_gen_kat -I ../include +// ./ascon_gen_kat -hash > ascon_hash.txt diff --git a/test/test_ascon_aead.py b/test/test_ascon_aead.py index e252b96..5046eb9 100644 --- a/test/test_ascon_aead.py +++ b/test/test_ascon_aead.py @@ -10,8 +10,8 @@ @pytest.mark.parametrize( "scheme, kat_file", [ - ("ascon128", "test_ascon_data/ascon128_aead.txt"), - ("ascon128a", "test_ascon_data/ascon128a_aead.txt"), + ("ascon128", "test_ascon_data/ascon_aead128.txt"), + ("ascon128a", "test_ascon_data/ascon_aead128a.txt"), ], ) def test_ascon_aead(scheme, kat_file, subtests): diff --git a/test/test_ascon_data/ascon128_aead.txt b/test/test_ascon_data/ascon_aead128.txt similarity index 99% rename from test/test_ascon_data/ascon128_aead.txt rename to test/test_ascon_data/ascon_aead128.txt index a6a7ab8..7eb4bd6 100644 --- a/test/test_ascon_data/ascon128_aead.txt +++ b/test/test_ascon_data/ascon_aead128.txt @@ -1,5 +1,4 @@ -# test cases for ascon128v12 from LWC AEAD KAT 128 -# tag is appended to ciphertext +# Generated by ascon_gen_kat Count = 1 Key = 000102030405060708090A0B0C0D0E0F Nonce = 000102030405060708090A0B0C0D0E0F @@ -7622,3 +7621,4 @@ Nonce = 000102030405060708090A0B0C0D0E0F PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F CT = B96C78651B6246B0C3B1A5D373B0D5168DCA4A96734CF0DDF5F92F8D15E30270279BF6A6CC3F2FC9350B915C292BDB8D + diff --git a/test/test_ascon_data/ascon128a_aead.txt b/test/test_ascon_data/ascon_aead128a.txt similarity index 99% rename from test/test_ascon_data/ascon128a_aead.txt rename to test/test_ascon_data/ascon_aead128a.txt index 494a62a..24a391e 100644 --- a/test/test_ascon_data/ascon128a_aead.txt +++ b/test/test_ascon_data/ascon_aead128a.txt @@ -1,5 +1,4 @@ -# test cases for ascon128av12 from LWC AEAD KAT 128 -# tag is appended to ciphertext +# Generated by ascon_gen_kat Count = 1 Key = 000102030405060708090A0B0C0D0E0F Nonce = 000102030405060708090A0B0C0D0E0F @@ -7622,3 +7621,4 @@ Nonce = 000102030405060708090A0B0C0D0E0F PT = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F AD = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F CT = A55236AC020DBDA74CE6CCD10C68C4D8514450A382BC87C68946D86A921DD88E2ADDDFBBE77D4112830E01960B9D38D5 + diff --git a/test/test_ascon_data/ascon_hash.txt b/test/test_ascon_data/ascon_hash.txt index 73f31e7..b724a25 100644 --- a/test/test_ascon_data/ascon_hash.txt +++ b/test/test_ascon_data/ascon_hash.txt @@ -1,4 +1,4 @@ -# test cases for ascon hash from LWC HASH KAT 256 +# Generated by ascon_gen_kat Count = 1 Msg = MD = 7346BC14F036E87AE03D0997913088F5F68411434B3CF8B54FA796A80D251F91 diff --git a/test/test_ascon_data/ascon_hasha.txt b/test/test_ascon_data/ascon_hasha.txt index dee1f0c..e3bc529 100644 --- a/test/test_ascon_data/ascon_hasha.txt +++ b/test/test_ascon_data/ascon_hasha.txt @@ -1,4 +1,4 @@ -# test cases for ascon hasha from LWC HASH KAT 256 +# Generated by ascon_gen_kat Count = 1 Msg = MD = AECD027026D0675F9DE7A8AD8CCF512DB64B1EDCF0B20C388A0C7CC617AAA2C4 @@ -4098,3 +4098,4 @@ MD = 9CC90678B18BA6FA51832BE07629A83AB577A4D2ED79E20A415775C0B86BBB9C Count = 1025 Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF MD = 14F6A0C1E5751733955B820CA67BC89BB7EB7014C88CAEB5F380D75EED484FE9 + diff --git a/test/test_hmac_data/ascon_hmac.txt b/test/test_hmac_data/ascon_hmac.txt index 02681ce..feb29cb 100644 --- a/test/test_hmac_data/ascon_hmac.txt +++ b/test/test_hmac_data/ascon_hmac.txt @@ -1,3 +1,4 @@ +# Generated by ascon_gen_kat Count = 1 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Msg = @@ -5122,3 +5123,4 @@ Count = 1025 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Msg = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF Tag = A571531AA19DE451A64C437394D9E54DB280E2BA5B12041061FCE58E7AEF06B3 + diff --git a/test/test_hmac_data/ascon_hmaca.txt b/test/test_hmac_data/ascon_hmaca.txt index 0d32cc7..230c1bd 100644 --- a/test/test_hmac_data/ascon_hmaca.txt +++ b/test/test_hmac_data/ascon_hmaca.txt @@ -1,3 +1,4 @@ +# Generated by ascon_gen_kat Count = 1 Key = 000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F Msg =