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>
298 lines
11 KiB
Diff
298 lines
11 KiB
Diff
From dd227f442774a570ffccdfbc9536fec3b4666305 Mon Sep 17 00:00:00 2001
|
|
From: Aleksander Jan Bajkowski <olek2@wp.pl>
|
|
Date: Sat, 31 Jan 2026 12:35:30 +0100
|
|
Subject: [PATCH] crypto: testmgr - Add test vectors for
|
|
authenc(hmac(md5),cbc(aes))
|
|
|
|
Test vectors were generated starting from existing CBC(AES) test vectors
|
|
(RFC3602, NIST SP800-38A) and adding HMAC(MD5) computed with Python
|
|
script. Then, the results were double-checked on Mediatek MT7981 (safexcel)
|
|
and NXP P2020 (talitos). Both platforms pass self-tests.
|
|
|
|
Signed-off-by: Aleksander Jan Bajkowski <olek2@wp.pl>
|
|
---
|
|
crypto/testmgr.c | 7 ++
|
|
crypto/testmgr.h | 255 +++++++++++++++++++++++++++++++++++++++++++++++
|
|
2 files changed, 262 insertions(+)
|
|
|
|
--- a/crypto/testmgr.c
|
|
+++ b/crypto/testmgr.c
|
|
@@ -4177,6 +4177,13 @@ static const struct alg_test_desc alg_te
|
|
.cprng = __VECS(ansi_cprng_aes_tv_template)
|
|
}
|
|
}, {
|
|
+ .alg = "authenc(hmac(md5),cbc(aes))",
|
|
+ .generic_driver = "authenc(hmac-md5-lib,cbc(aes-generic))",
|
|
+ .test = alg_test_aead,
|
|
+ .suite = {
|
|
+ .aead = __VECS(hmac_md5_aes_cbc_tv_temp)
|
|
+ }
|
|
+ }, {
|
|
.alg = "authenc(hmac(md5),cbc(des))",
|
|
.generic_driver = "authenc(hmac-md5-lib,cbc(des-generic))",
|
|
.test = alg_test_aead,
|
|
--- a/crypto/testmgr.h
|
|
+++ b/crypto/testmgr.h
|
|
@@ -15946,6 +15946,261 @@ static const struct cipher_testvec aes_c
|
|
},
|
|
};
|
|
|
|
+static const struct aead_testvec hmac_md5_aes_cbc_tv_temp[] = {
|
|
+ { /* RFC 3602 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\x10" /* enc key length */
|
|
+ "\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
+ "\x00\x00\x00\x00\x00\x00\x00\x00"
|
|
+ "\x06\xa9\x21\x40\x36\xb8\xa1\x5b"
|
|
+ "\x51\x2e\x03\xd5\x34\x12\x00\x06",
|
|
+ .klen = 8 + 16 + 16,
|
|
+ .iv = "\x3d\xaf\xba\x42\x9d\x9e\xb4\x30"
|
|
+ "\xb4\x22\xda\x80\x2c\x9f\xac\x41",
|
|
+ .assoc = "\x3d\xaf\xba\x42\x9d\x9e\xb4\x30"
|
|
+ "\xb4\x22\xda\x80\x2c\x9f\xac\x41",
|
|
+ .alen = 16,
|
|
+ .ptext = "Single block msg",
|
|
+ .plen = 16,
|
|
+ .ctext = "\xe3\x53\x77\x9c\x10\x79\xae\xb8"
|
|
+ "\x27\x08\x94\x2d\xbe\x77\x18\x1a"
|
|
+ "\x22\x10\xf2\x25\x7f\xe9\x0d\x92"
|
|
+ "\xfc\x00\x55\xb1\xd0\xb5\x3a\x74",
|
|
+ .clen = 16 + 16,
|
|
+ }, { /* RFC 3602 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\x10" /* enc key length */
|
|
+ "\x20\x21\x22\x23\x24\x25\x26\x27"
|
|
+ "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
|
|
+ "\xc2\x86\x69\x6d\x88\x7c\x9a\xa0"
|
|
+ "\x61\x1b\xbb\x3e\x20\x25\xa4\x5a",
|
|
+ .klen = 8 + 16 + 16,
|
|
+ .iv = "\x56\x2e\x17\x99\x6d\x09\x3d\x28"
|
|
+ "\xdd\xb3\xba\x69\x5a\x2e\x6f\x58",
|
|
+ .assoc = "\x56\x2e\x17\x99\x6d\x09\x3d\x28"
|
|
+ "\xdd\xb3\xba\x69\x5a\x2e\x6f\x58",
|
|
+ .alen = 16,
|
|
+ .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 = "\xd2\x96\xcd\x94\xc2\xcc\xcf\x8a"
|
|
+ "\x3a\x86\x30\x28\xb5\xe1\xdc\x0a"
|
|
+ "\x75\x86\x60\x2d\x25\x3c\xff\xf9"
|
|
+ "\x1b\x82\x66\xbe\xa6\xd6\x1a\xb1"
|
|
+ "\x31\xef\xd1\x5e\x2d\x83\xde\x59"
|
|
+ "\x5c\x63\x6c\xd6\x6e\x96\x8c\x5b",
|
|
+ .clen = 32 + 16,
|
|
+ }, { /* RFC 3602 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\x10" /* enc key length */
|
|
+ "\x11\x22\x33\x44\x55\x66\x77\x88"
|
|
+ "\x99\xaa\xbb\xcc\xdd\xee\xff\x11"
|
|
+ "\x6c\x3e\xa0\x47\x76\x30\xce\x21"
|
|
+ "\xa2\xce\x33\x4a\xa7\x46\xc2\xcd",
|
|
+ .klen = 8 + 16 + 16,
|
|
+ .iv = "\xc7\x82\xdc\x4c\x09\x8c\x66\xcb"
|
|
+ "\xd9\xcd\x27\xd8\x25\x68\x2c\x81",
|
|
+ .assoc = "\xc7\x82\xdc\x4c\x09\x8c\x66\xcb"
|
|
+ "\xd9\xcd\x27\xd8\x25\x68\x2c\x81",
|
|
+ .alen = 16,
|
|
+ .ptext = "This is a 48-byte message (exactly 3 AES blocks)",
|
|
+ .plen = 48,
|
|
+ .ctext = "\xd0\xa0\x2b\x38\x36\x45\x17\x53"
|
|
+ "\xd4\x93\x66\x5d\x33\xf0\xe8\x86"
|
|
+ "\x2d\xea\x54\xcd\xb2\x93\xab\xc7"
|
|
+ "\x50\x69\x39\x27\x67\x72\xf8\xd5"
|
|
+ "\x02\x1c\x19\x21\x6b\xad\x52\x5c"
|
|
+ "\x85\x79\x69\x5d\x83\xba\x26\x84"
|
|
+ "\xa1\x9e\xc5\x65\x43\xc5\x51\x70"
|
|
+ "\xb5\xc8\x38\xce\xbb\x3b\xc6\x0f",
|
|
+ .clen = 48 + 16,
|
|
+ }, { /* RFC 3602 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\x10" /* enc key length */
|
|
+ "\x11\x22\x33\x44\x55\x66\x77\x88"
|
|
+ "\x99\xaa\xbb\xcc\xdd\xee\xff\x11"
|
|
+ "\x56\xe4\x7a\x38\xc5\x59\x89\x74"
|
|
+ "\xbc\x46\x90\x3d\xba\x29\x03\x49",
|
|
+ .klen = 8 + 16 + 16,
|
|
+ .iv = "\x8c\xe8\x2e\xef\xbe\xa0\xda\x3c"
|
|
+ "\x44\x69\x9e\xd7\xdb\x51\xb7\xd9",
|
|
+ .assoc = "\x8c\xe8\x2e\xef\xbe\xa0\xda\x3c"
|
|
+ "\x44\x69\x9e\xd7\xdb\x51\xb7\xd9",
|
|
+ .alen = 16,
|
|
+ .ptext = "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7"
|
|
+ "\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
|
|
+ "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7"
|
|
+ "\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
|
|
+ "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7"
|
|
+ "\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
|
|
+ "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7"
|
|
+ "\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf",
|
|
+ .plen = 64,
|
|
+ .ctext = "\xc3\x0e\x32\xff\xed\xc0\x77\x4e"
|
|
+ "\x6a\xff\x6a\xf0\x86\x9f\x71\xaa"
|
|
+ "\x0f\x3a\xf0\x7a\x9a\x31\xa9\xc6"
|
|
+ "\x84\xdb\x20\x7e\xb0\xef\x8e\x4e"
|
|
+ "\x35\x90\x7a\xa6\x32\xc3\xff\xdf"
|
|
+ "\x86\x8b\xb7\xb2\x9d\x3d\x46\xad"
|
|
+ "\x83\xce\x9f\x9a\x10\x2e\xe9\x9d"
|
|
+ "\x49\xa5\x3e\x87\xf4\xc3\xda\x55"
|
|
+ "\x19\x90\xcc\x2c\x6d\x76\x0f\xd6"
|
|
+ "\x6c\x54\x09\xb1\x3e\x98\x0c\x11",
|
|
+ .clen = 64 + 16,
|
|
+ }, { /* RFC 3602 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\x10" /* enc key length */
|
|
+ "\x11\x22\x33\x44\x55\x66\x77\x88"
|
|
+ "\x99\xaa\xbb\xcc\xdd\xee\xff\x11"
|
|
+ "\x90\xd3\x82\xb4\x10\xee\xba\x7a"
|
|
+ "\xd9\x38\xc4\x6c\xec\x1a\x82\xbf",
|
|
+ .klen = 8 + 16 + 16,
|
|
+ .iv = "\xe9\x6e\x8c\x08\xab\x46\x57\x63"
|
|
+ "\xfd\x09\x8d\x45\xdd\x3f\xf8\x93",
|
|
+ .assoc = "\x00\x00\x43\x21\x00\x00\x00\x01"
|
|
+ "\xe9\x6e\x8c\x08\xab\x46\x57\x63"
|
|
+ "\xfd\x09\x8d\x45\xdd\x3f\xf8\x93",
|
|
+ .alen = 24,
|
|
+ .ptext = "\x08\x00\x0e\xbd\xa7\x0a\x00\x00"
|
|
+ "\x8e\x9c\x08\x3d\xb9\x5b\x07\x00"
|
|
+ "\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\x24\x25\x26\x27"
|
|
+ "\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
|
|
+ "\x30\x31\x32\x33\x34\x35\x36\x37"
|
|
+ "\x01\x02\x03\x04\x05\x06\x07\x08"
|
|
+ "\x09\x0a\x0b\x0c\x0d\x0e\x0e\x01",
|
|
+ .plen = 80,
|
|
+ .ctext = "\xf6\x63\xc2\x5d\x32\x5c\x18\xc6"
|
|
+ "\xa9\x45\x3e\x19\x4e\x12\x08\x49"
|
|
+ "\xa4\x87\x0b\x66\xcc\x6b\x99\x65"
|
|
+ "\x33\x00\x13\xb4\x89\x8d\xc8\x56"
|
|
+ "\xa4\x69\x9e\x52\x3a\x55\xdb\x08"
|
|
+ "\x0b\x59\xec\x3a\x8e\x4b\x7e\x52"
|
|
+ "\x77\x5b\x07\xd1\xdb\x34\xed\x9c"
|
|
+ "\x53\x8a\xb5\x0c\x55\x1b\x87\x4a"
|
|
+ "\xa2\x69\xad\xd0\x47\xad\x2d\x59"
|
|
+ "\x13\xac\x19\xb7\xcf\xba\xd4\xa6"
|
|
+ "\x9f\x6f\xa4\x85\x28\xf1\xc9\xea"
|
|
+ "\xe1\xd0\x7d\x30\x4a\xd0\x81\x12",
|
|
+ .clen = 80 + 16,
|
|
+ }, { /* NIST SP800-38A F.2.3 CBC-AES192.Encrypt */
|
|
+#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\x18" /* enc key length */
|
|
+ "\x11\x22\x33\x44\x55\x66\x77\x88"
|
|
+ "\x99\xaa\xbb\xcc\xdd\xee\xff\x11"
|
|
+ "\x8e\x73\xb0\xf7\xda\x0e\x64\x52"
|
|
+ "\xc8\x10\xf3\x2b\x80\x90\x79\xe5"
|
|
+ "\x62\xf8\xea\xd2\x52\x2c\x6b\x7b",
|
|
+ .klen = 8 + 16 + 24,
|
|
+ .iv = "\x00\x01\x02\x03\x04\x05\x06\x07"
|
|
+ "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
|
|
+ .assoc = "\x00\x01\x02\x03\x04\x05\x06\x07"
|
|
+ "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
|
|
+ .alen = 16,
|
|
+ .ptext = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
|
|
+ "\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
|
|
+ "\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
|
|
+ "\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
|
|
+ "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
|
|
+ "\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
|
|
+ "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
|
|
+ "\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
|
|
+ .plen = 64,
|
|
+ .ctext = "\x4f\x02\x1d\xb2\x43\xbc\x63\x3d"
|
|
+ "\x71\x78\x18\x3a\x9f\xa0\x71\xe8"
|
|
+ "\xb4\xd9\xad\xa9\xad\x7d\xed\xf4"
|
|
+ "\xe5\xe7\x38\x76\x3f\x69\x14\x5a"
|
|
+ "\x57\x1b\x24\x20\x12\xfb\x7a\xe0"
|
|
+ "\x7f\xa9\xba\xac\x3d\xf1\x02\xe0"
|
|
+ "\x08\xb0\xe2\x79\x88\x59\x88\x81"
|
|
+ "\xd9\x20\xa9\xe6\x4f\x56\x15\xcd"
|
|
+ "\xc3\x46\xe5\x2c\x07\x27\x50\xca"
|
|
+ "\x50\x4a\x83\x5f\x72\xd9\x76\x8d",
|
|
+ .clen = 64 + 16,
|
|
+ }, { /* NIST SP800-38A F.2.5 CBC-AES256.Encrypt */
|
|
+#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\x20" /* enc key length */
|
|
+ "\x11\x22\x33\x44\x55\x66\x77\x88"
|
|
+ "\x99\xaa\xbb\xcc\xdd\xee\xff\x11"
|
|
+ "\x60\x3d\xeb\x10\x15\xca\x71\xbe"
|
|
+ "\x2b\x73\xae\xf0\x85\x7d\x77\x81"
|
|
+ "\x1f\x35\x2c\x07\x3b\x61\x08\xd7"
|
|
+ "\x2d\x98\x10\xa3\x09\x14\xdf\xf4",
|
|
+ .klen = 8 + 16 + 32,
|
|
+ .iv = "\x00\x01\x02\x03\x04\x05\x06\x07"
|
|
+ "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
|
|
+ .assoc = "\x00\x01\x02\x03\x04\x05\x06\x07"
|
|
+ "\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
|
|
+ .alen = 16,
|
|
+ .ptext = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
|
|
+ "\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
|
|
+ "\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
|
|
+ "\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
|
|
+ "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
|
|
+ "\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
|
|
+ "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
|
|
+ "\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
|
|
+ .plen = 64,
|
|
+ .ctext = "\xf5\x8c\x4c\x04\xd6\xe5\xf1\xba"
|
|
+ "\x77\x9e\xab\xfb\x5f\x7b\xfb\xd6"
|
|
+ "\x9c\xfc\x4e\x96\x7e\xdb\x80\x8d"
|
|
+ "\x67\x9f\x77\x7b\xc6\x70\x2c\x7d"
|
|
+ "\x39\xf2\x33\x69\xa9\xd9\xba\xcf"
|
|
+ "\xa5\x30\xe2\x63\x04\x23\x14\x61"
|
|
+ "\xb2\xeb\x05\xe2\xc3\x9b\xe9\xfc"
|
|
+ "\xda\x6c\x19\x07\x8c\x6a\x9d\x1b"
|
|
+ "\x59\x62\x06\x71\x57\xdf\x18\x15"
|
|
+ "\x32\x02\xfa\xce\x2c\xd2\x1a\x8d",
|
|
+ .clen = 64 + 16,
|
|
+ },
|
|
+};
|
|
+
|
|
static const struct aead_testvec hmac_md5_ecb_cipher_null_tv_template[] = {
|
|
{ /* Input data from RFC 2410 Case 1 */
|
|
#ifdef __LITTLE_ENDIAN
|