FIPS 140-3 recommends that all crypto implementations should be tested before first use. Testmanager performs initial tests based on existing test vectors. Not all algorithms have defined test vectors, so to improve this situation, this commit backports recently added test vectors for some cipher suites. These vectors were calculated using a software implementation and then double-checked on Mediatek MT7981 (safexcel) and NXP P2020 (talitos). Both platforms passed self-tests. Signed-off-by: Aleksander Jan Bajkowski <olek2@wp.pl> Link: https://github.com/openwrt/openwrt/pull/23012 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
335 lines
12 KiB
Diff
335 lines
12 KiB
Diff
From 82fc2b17fa5b9b12d34770afcc8e3c4288735429 Mon Sep 17 00:00:00 2001
|
|
From: Aleksander Jan Bajkowski <olek2@wp.pl>
|
|
Date: Thu, 5 Mar 2026 21:08:24 +0100
|
|
Subject: [PATCH 5/5] crypto: testmgr - Add test vectors for
|
|
authenc(hmac(sha512),rfc3686(ctr(aes)))
|
|
|
|
Test vectors were generated starting from existing RFC3686(CTR(AES)) test
|
|
vectors and adding HMAC(SHA512) computed with software implementation.
|
|
Then, the results were double-checked on Mediatek MT7986 (safexcel).
|
|
Platform pass self-tests.
|
|
|
|
Signed-off-by: Aleksander Jan Bajkowski <olek2@wp.pl>
|
|
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
|
|
---
|
|
crypto/testmgr.c | 6 +-
|
|
crypto/testmgr.h | 291 +++++++++++++++++++++++++++++++++++++++++++++++
|
|
2 files changed, 296 insertions(+), 1 deletion(-)
|
|
|
|
--- a/crypto/testmgr.c
|
|
+++ b/crypto/testmgr.c
|
|
@@ -4545,8 +4545,12 @@ static const struct alg_test_desc alg_te
|
|
.fips_allowed = 1,
|
|
}, {
|
|
.alg = "authenc(hmac(sha512),rfc3686(ctr(aes)))",
|
|
- .test = alg_test_null,
|
|
+ .generic_driver = "authenc(hmac-sha512-lib,rfc3686(ctr(aes-lib)))",
|
|
+ .test = alg_test_aead,
|
|
.fips_allowed = 1,
|
|
+ .suite = {
|
|
+ .aead = __VECS(hmac_sha512_aes_ctr_rfc3686_tv_temp)
|
|
+ }
|
|
}, {
|
|
.alg = "blake2b-160",
|
|
.test = alg_test_hash,
|
|
--- a/crypto/testmgr.h
|
|
+++ b/crypto/testmgr.h
|
|
@@ -19839,6 +19839,297 @@ static const struct aead_testvec hmac_md
|
|
},
|
|
};
|
|
|
|
+static const struct aead_testvec hmac_sha512_aes_ctr_rfc3686_tv_temp[] = {
|
|
+ { /* RFC 3686 Case 1 */
|
|
+#ifdef __LITTLE_ENDIAN
|
|
+ .key = "\x08\x00" /* rta length */
|
|
+ "\x01\x00" /* rta type */
|
|
+#else
|
|
+ .key = "\x00\x08" /* rta length */
|
|
+ "\x00\x01" /* rta type */
|
|
+#endif
|
|
+ "\x00\x00\x00\x14" /* enc key length */
|
|
+ "\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
+ "\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
+ "\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
+ "\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
+ "\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
+ "\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
+ "\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
+ "\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
+ "\xae\x68\x52\xf8\x12\x10\x67\xcc"
|
|
+ "\x4b\xf7\xa5\x76\x55\x77\xf3\x9e"
|
|
+ "\x00\x00\x00\x30",
|
|
+ .klen = 8 + 64 + 20,
|
|
+ .iv = "\x00\x00\x00\x00\x00\x00\x00\x00",
|
|
+ .assoc = "\x00\x00\x00\x00\x00\x00\x00\x00",
|
|
+ .alen = 8,
|
|
+ .ptext = "Single block msg",
|
|
+ .plen = 16,
|
|
+ .ctext = "\xe4\x09\x5d\x4f\xb7\xa7\xb3\x79"
|
|
+ "\x2d\x61\x75\xa3\x26\x13\x11\xb8"
|
|
+ "\xa4\x45\x3a\x44\x9c\xe5\x1c\xd9"
|
|
+ "\x10\x43\x51\x2e\x76\x5e\xf8\x9d"
|
|
+ "\x03\x12\x1a\x31\x00\x33\x10\xb4"
|
|
+ "\x94\x4b\x70\x84\x6c\xda\xb1\x46"
|
|
+ "\x24\xb6\x3b\x2a\xec\xd5\x67\xb8"
|
|
+ "\x65\xa2\xbd\xac\x18\xe2\xf8\x55"
|
|
+ "\xc6\x91\xb0\x92\x84\x2d\x74\x44"
|
|
+ "\xa7\xee\xc3\x44\xa0\x07\x0e\x62",
|
|
+ .clen = 16 + 64,
|
|
+ }, { /* RFC 3686 Case 2 */
|
|
+#ifdef __LITTLE_ENDIAN
|
|
+ .key = "\x08\x00" /* rta length */
|
|
+ "\x01\x00" /* rta type */
|
|
+#else
|
|
+ .key = "\x00\x08" /* rta length */
|
|
+ "\x00\x01" /* rta type */
|
|
+#endif
|
|
+ "\x00\x00\x00\x14" /* enc key length */
|
|
+ "\x20\x21\x22\x23\x24\x25\x26\x27"
|
|
+ "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
|
|
+ "\x30\x31\x32\x33\x34\x35\x36\x37"
|
|
+ "\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
|
|
+ "\x40\x41\x42\x43\x44\x45\x46\x47"
|
|
+ "\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
|
|
+ "\x50\x51\x52\x53\x54\x55\x56\x57"
|
|
+ "\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
|
|
+ "\x7e\x24\x06\x78\x17\xfa\xe0\xd7"
|
|
+ "\x43\xd6\xce\x1f\x32\x53\x91\x63"
|
|
+ "\x00\x6c\xb6\xdb",
|
|
+ .klen = 8 + 64 + 20,
|
|
+ .iv = "\xc0\x54\x3b\x59\xda\x48\xd9\x0b",
|
|
+ .assoc = "\xc0\x54\x3b\x59\xda\x48\xd9\x0b",
|
|
+ .alen = 8,
|
|
+ .ptext = "\x00\x01\x02\x03\x04\x05\x06\x07"
|
|
+ "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
|
|
+ "\x10\x11\x12\x13\x14\x15\x16\x17"
|
|
+ "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
|
|
+ .plen = 32,
|
|
+ .ctext = "\x51\x04\xa1\x06\x16\x8a\x72\xd9"
|
|
+ "\x79\x0d\x41\xee\x8e\xda\xd3\x88"
|
|
+ "\xeb\x2e\x1e\xfc\x46\xda\x57\xc8"
|
|
+ "\xfc\xe6\x30\xdf\x91\x41\xbe\x28"
|
|
+ "\xec\x67\x0d\xb3\xbd\x98\x13\x01"
|
|
+ "\x2b\x04\x9b\xe6\x06\x67\x3c\x76"
|
|
+ "\xcd\x41\xb7\xcc\x70\x6c\x7f\xc8"
|
|
+ "\x67\xbd\x22\x39\xb2\xaa\xe8\x88"
|
|
+ "\xe0\x4f\x81\x52\xdf\xc9\xc3\xd6"
|
|
+ "\x44\xf4\x66\x33\x87\x64\x61\x02"
|
|
+ "\x02\xa2\x64\x15\x2b\xe9\x0b\x3d"
|
|
+ "\x4c\xea\xa1\xa5\xa7\xc9\xd3\x1b",
|
|
+ .clen = 32 + 64,
|
|
+ }, { /* RFC 3686 Case 3 */
|
|
+#ifdef __LITTLE_ENDIAN
|
|
+ .key = "\x08\x00" /* rta length */
|
|
+ "\x01\x00" /* rta type */
|
|
+#else
|
|
+ .key = "\x00\x08" /* rta length */
|
|
+ "\x00\x01" /* rta type */
|
|
+#endif
|
|
+ "\x00\x00\x00\x14" /* enc key length */
|
|
+ "\x11\x22\x33\x44\x55\x66\x77\x88"
|
|
+ "\x99\xaa\xbb\xcc\xdd\xee\xff\x11"
|
|
+ "\x22\x33\x44\x55\x66\x77\x88\x99"
|
|
+ "\xaa\xbb\xcc\xdd\xee\xff\x11\x22"
|
|
+ "\x33\x44\x55\x66\x77\x88\x99\xaa"
|
|
+ "\xbb\xcc\xdd\xee\xff\x11\x22\x33"
|
|
+ "\x44\x55\x66\x77\x88\x99\xaa\xbb"
|
|
+ "\xcc\xdd\xee\xff\x11\x22\x33\x44"
|
|
+ "\x76\x91\xbe\x03\x5e\x50\x20\xa8"
|
|
+ "\xac\x6e\x61\x85\x29\xf9\xa0\xdc"
|
|
+ "\x00\xe0\x01\x7b",
|
|
+ .klen = 8 + 64 + 20,
|
|
+ .iv = "\x27\x77\x7f\x3f\x4a\x17\x86\xf0",
|
|
+ .assoc = "\x27\x77\x7f\x3f\x4a\x17\x86\xf0",
|
|
+ .alen = 8,
|
|
+ .ptext = "\x00\x01\x02\x03\x04\x05\x06\x07"
|
|
+ "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
|
|
+ "\x10\x11\x12\x13\x14\x15\x16\x17"
|
|
+ "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
|
|
+ "\x20\x21\x22\x23",
|
|
+ .plen = 36,
|
|
+ .ctext = "\xc1\xcf\x48\xa8\x9f\x2f\xfd\xd9"
|
|
+ "\xcf\x46\x52\xe9\xef\xdb\x72\xd7"
|
|
+ "\x45\x40\xa4\x2b\xde\x6d\x78\x36"
|
|
+ "\xd5\x9a\x5c\xea\xae\xf3\x10\x53"
|
|
+ "\x25\xb2\x07\x2f"
|
|
+ "\x6f\x90\xb6\xa3\x35\x43\x59\xff"
|
|
+ "\x1e\x32\xd6\xfe\xfa\x33\xf9\xf0"
|
|
+ "\x31\x2f\x03\x2d\x88\x1d\xab\xbf"
|
|
+ "\x0e\x19\x16\xd9\xf3\x98\x3e\xdd"
|
|
+ "\x0c\xec\xfe\xe8\x89\x13\x91\x15"
|
|
+ "\xf6\x61\x65\x5c\x1b\x7d\xde\xc0"
|
|
+ "\xe4\xba\x6d\x27\xe2\x89\x23\x24"
|
|
+ "\x15\x82\x37\x3d\x48\xd3\xc9\x32",
|
|
+ .clen = 36 + 64,
|
|
+ }, { /* RFC 3686 Case 4 */
|
|
+#ifdef __LITTLE_ENDIAN
|
|
+ .key = "\x08\x00" /* rta length */
|
|
+ "\x01\x00" /* rta type */
|
|
+#else
|
|
+ .key = "\x00\x08" /* rta length */
|
|
+ "\x00\x01" /* rta type */
|
|
+#endif
|
|
+ "\x00\x00\x00\x1c" /* enc key length */
|
|
+ "\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
+ "\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
+ "\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
+ "\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
+ "\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
+ "\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
+ "\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
+ "\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
+ "\x16\xaf\x5b\x14\x5f\xc9\xf5\x79"
|
|
+ "\xc1\x75\xf9\x3e\x3b\xfb\x0e\xed"
|
|
+ "\x86\x3d\x06\xcc\xfd\xb7\x85\x15"
|
|
+ "\x00\x00\x00\x48",
|
|
+ .klen = 8 + 64 + 28,
|
|
+ .iv = "\x36\x73\x3c\x14\x7d\x6d\x93\xcb",
|
|
+ .assoc = "\x36\x73\x3c\x14\x7d\x6d\x93\xcb",
|
|
+ .alen = 8,
|
|
+ .ptext = "Single block msg",
|
|
+ .plen = 16,
|
|
+ .ctext = "\x4b\x55\x38\x4f\xe2\x59\xc9\xc8"
|
|
+ "\x4e\x79\x35\xa0\x03\xcb\xe9\x28"
|
|
+ "\x25\xea\xdc\xad\x52\xb8\x0f\x70"
|
|
+ "\xe7\x39\x83\x80\x10\x3f\x18\xc4"
|
|
+ "\xf8\x59\x14\x25\x5f\xba\x20\x87"
|
|
+ "\x0b\x04\x5e\xf7\xde\x41\x39\xff"
|
|
+ "\xa2\xee\x84\x3f\x9d\x38\xfd\x17"
|
|
+ "\xc0\x66\x5e\x74\x39\xe3\xd3\xd7"
|
|
+ "\x3d\xbc\xe3\x99\x2f\xe7\xef\x37"
|
|
+ "\x61\x03\xf3\x9e\x01\xaf\xba\x9d",
|
|
+ .clen = 16 + 64,
|
|
+ }, { /* RFC 3686 Case 5 */
|
|
+#ifdef __LITTLE_ENDIAN
|
|
+ .key = "\x08\x00" /* rta length */
|
|
+ "\x01\x00" /* rta type */
|
|
+#else
|
|
+ .key = "\x00\x08" /* rta length */
|
|
+ "\x00\x01" /* rta type */
|
|
+#endif
|
|
+ "\x00\x00\x00\x1c" /* enc key length */
|
|
+ "\x20\x21\x22\x23\x24\x25\x26\x27"
|
|
+ "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
|
|
+ "\x30\x31\x32\x33\x34\x35\x36\x37"
|
|
+ "\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
|
|
+ "\x40\x41\x42\x43\x44\x45\x46\x47"
|
|
+ "\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
|
|
+ "\x50\x51\x52\x53\x54\x55\x56\x57"
|
|
+ "\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
|
|
+ "\x7c\x5c\xb2\x40\x1b\x3d\xc3\x3c"
|
|
+ "\x19\xe7\x34\x08\x19\xe0\xf6\x9c"
|
|
+ "\x67\x8c\x3d\xb8\xe6\xf6\xa9\x1a"
|
|
+ "\x00\x96\xb0\x3b",
|
|
+ .klen = 8 + 64 + 28,
|
|
+ .iv = "\x02\x0c\x6e\xad\xc2\xcb\x50\x0d",
|
|
+ .assoc = "\x02\x0c\x6e\xad\xc2\xcb\x50\x0d",
|
|
+ .alen = 8,
|
|
+ .ptext = "\x00\x01\x02\x03\x04\x05\x06\x07"
|
|
+ "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
|
|
+ "\x10\x11\x12\x13\x14\x15\x16\x17"
|
|
+ "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
|
|
+ .plen = 32,
|
|
+ .ctext = "\x45\x32\x43\xfc\x60\x9b\x23\x32"
|
|
+ "\x7e\xdf\xaa\xfa\x71\x31\xcd\x9f"
|
|
+ "\x84\x90\x70\x1c\x5a\xd4\xa7\x9c"
|
|
+ "\xfc\x1f\xe0\xff\x42\xf4\xfb\x00"
|
|
+ "\x51\xa3\xe6\x1d\x23\x7d\xd1\x18"
|
|
+ "\x55\x9c\x1c\x92\x2b\xc2\xcd\xfe"
|
|
+ "\x8a\xa8\xa5\x96\x65\x2e\x9d\xdb"
|
|
+ "\x06\xd2\x1c\x57\x2b\x76\xb5\x9c"
|
|
+ "\xd4\x3e\x8b\x61\x54\x2d\x08\xe5"
|
|
+ "\xb2\xf8\x88\x20\x0c\xad\xe8\x85"
|
|
+ "\x61\x8e\x5c\xa4\x96\x2c\xe2\x7d"
|
|
+ "\x4f\xb6\x1d\xb2\x8c\xd7\xe3\x38",
|
|
+ .clen = 32 + 64,
|
|
+ }, { /* RFC 3686 Case 7 */
|
|
+#ifdef __LITTLE_ENDIAN
|
|
+ .key = "\x08\x00" /* rta length */
|
|
+ "\x01\x00" /* rta type */
|
|
+#else
|
|
+ .key = "\x00\x08" /* rta length */
|
|
+ "\x00\x01" /* rta type */
|
|
+#endif
|
|
+ "\x00\x00\x00\x24" /* enc key length */
|
|
+ "\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
+ "\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
+ "\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
+ "\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
+ "\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
+ "\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
+ "\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
+ "\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
+ "\x77\x6b\xef\xf2\x85\x1d\xb0\x6f"
|
|
+ "\x4c\x8a\x05\x42\xc8\x69\x6f\x6c"
|
|
+ "\x6a\x81\xaf\x1e\xec\x96\xb4\xd3"
|
|
+ "\x7f\xc1\xd6\x89\xe6\xc1\xc1\x04"
|
|
+ "\x00\x00\x00\x60",
|
|
+ .klen = 8 + 64 + 36,
|
|
+ .iv = "\xdb\x56\x72\xc9\x7a\xa8\xf0\xb2",
|
|
+ .assoc = "\xdb\x56\x72\xc9\x7a\xa8\xf0\xb2",
|
|
+ .alen = 8,
|
|
+ .ptext = "Single block msg",
|
|
+ .plen = 16,
|
|
+ .ctext = "\x14\x5a\xd0\x1d\xbf\x82\x4e\xc7"
|
|
+ "\x56\x08\x63\xdc\x71\xe3\xe0\xc0"
|
|
+ "\x6b\x68\x0b\x99\x9a\x4d\xc8\xb9"
|
|
+ "\x35\xea\xcd\x56\x3f\x40\xa2\xb6"
|
|
+ "\x68\xda\x59\xd8\xa0\x89\xcd\x52"
|
|
+ "\xb1\x6e\xed\xc1\x42\x10\xa5\x0f"
|
|
+ "\x88\x0b\x80\xce\xc4\x67\xf0\x45"
|
|
+ "\x5d\xb2\x9e\xde\x1c\x79\x52\x0d"
|
|
+ "\xff\x75\x36\xd5\x0f\x52\x8e\xe5"
|
|
+ "\x31\x85\xcf\x1d\x31\xf8\x62\x67",
|
|
+ .clen = 16 + 64,
|
|
+ }, { /* RFC 3686 Case 8 */
|
|
+#ifdef __LITTLE_ENDIAN
|
|
+ .key = "\x08\x00" /* rta length */
|
|
+ "\x01\x00" /* rta type */
|
|
+#else
|
|
+ .key = "\x00\x08" /* rta length */
|
|
+ "\x00\x01" /* rta type */
|
|
+#endif
|
|
+ "\x00\x00\x00\x24" /* enc key length */
|
|
+ "\x20\x21\x22\x23\x24\x25\x26\x27"
|
|
+ "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
|
|
+ "\x30\x31\x32\x33\x34\x35\x36\x37"
|
|
+ "\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
|
|
+ "\x40\x41\x42\x43\x44\x45\x46\x47"
|
|
+ "\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
|
|
+ "\x50\x51\x52\x53\x54\x55\x56\x57"
|
|
+ "\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
|
|
+ "\xf6\xd6\x6d\x6b\xd5\x2d\x59\xbb"
|
|
+ "\x07\x96\x36\x58\x79\xef\xf8\x86"
|
|
+ "\xc6\x6d\xd5\x1a\x5b\x6a\x99\x74"
|
|
+ "\x4b\x50\x59\x0c\x87\xa2\x38\x84"
|
|
+ "\x00\xfa\xac\x24",
|
|
+ .klen = 8 + 64 + 36,
|
|
+ .iv = "\xc1\x58\x5e\xf1\x5a\x43\xd8\x75",
|
|
+ .assoc = "\xc1\x58\x5e\xf1\x5a\x43\xd8\x75",
|
|
+ .alen = 8,
|
|
+ .ptext = "\x00\x01\x02\x03\x04\x05\x06\x07"
|
|
+ "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
|
|
+ "\x10\x11\x12\x13\x14\x15\x16\x17"
|
|
+ "\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
|
|
+ .plen = 32,
|
|
+ .ctext = "\xf0\x5e\x23\x1b\x38\x94\x61\x2c"
|
|
+ "\x49\xee\x00\x0b\x80\x4e\xb2\xa9"
|
|
+ "\xb8\x30\x6b\x50\x8f\x83\x9d\x6a"
|
|
+ "\x55\x30\x83\x1d\x93\x44\xaf\x1c"
|
|
+ "\x9a\xac\x38\xbd\xf3\xcf\xd5\xd0"
|
|
+ "\x09\x07\xa6\xe1\x7f\xd6\x79\x98"
|
|
+ "\x4e\x90\x0e\xc0\x3d\xa0\xf2\x12"
|
|
+ "\x52\x79\x9c\x17\xff\xb9\xb8\xe3"
|
|
+ "\x2f\x31\xcb\xbd\x63\x70\x72\x7b"
|
|
+ "\x4e\x1e\xd1\xde\xb5\x6b\x7d\x54"
|
|
+ "\x68\x56\xdd\xe5\x53\xee\x29\xd2"
|
|
+ "\x85\xa1\x73\x61\x00\xa9\x26\x8f",
|
|
+ .clen = 32 + 64,
|
|
+ },
|
|
+};
|
|
+
|
|
static const struct aead_testvec hmac_sha1_des_cbc_tv_temp[] = {
|
|
{ /*Generated with cryptopp*/
|
|
#ifdef __LITTLE_ENDIAN
|