blob: 2892700fb27e712eebbac5989777fed5c0388349 [file] [log] [blame]
Damjan Marion9caef2a2024-01-08 19:05:40 +00001/* SPDX-License-Identifier: Apache-2.0
2 * Copyright(c) 2024 Cisco Systems, Inc.
3 */
4
Damjan Marion7e9513b2024-01-15 11:37:33 +01005#if defined(__AES__) || defined(__ARM_FEATURE_CRYPTO)
Damjan Marion9caef2a2024-01-08 19:05:40 +00006#include <vppinfra/format.h>
7#include <vppinfra/test/test.h>
8#include <vppinfra/crypto/aes_ctr.h>
9
10static const struct
11{
12 char *name;
13 const u8 *pt, *key, *ct, *iv;
14 u32 data_len;
15} test_cases128[] = {
16 /* test cases */
17 { .name = "RFC3686 Test Vector #1",
18 .key = (const u8[16]){ 0xae, 0x68, 0x52, 0xf8, 0x12, 0x10, 0x67, 0xcc,
19 0x4b, 0xf7, 0xa5, 0x76, 0x55, 0x77, 0xf3, 0x9e },
20 .iv = (const u8[16]){ 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
21 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
22
23 .pt = (const u8 *) "Single block msg",
24 .ct = (const u8[16]){ 0xe4, 0x09, 0x5d, 0x4f, 0xb7, 0xa7, 0xb3, 0x79, 0x2d,
25 0x61, 0x75, 0xa3, 0x26, 0x13, 0x11, 0xb8 },
26 .data_len = 16 },
27 { .name = "RFC3686 Test Vector #2",
28 .key = (const u8[16]){ 0x7e, 0x24, 0x06, 0x78, 0x17, 0xfa, 0xe0, 0xd7,
29 0x43, 0xd6, 0xce, 0x1f, 0x32, 0x53, 0x91, 0x63 },
30 .iv = (const u8[16]){ 0x00, 0x6c, 0xb6, 0xdb, 0xc0, 0x54, 0x3b, 0x59, 0xda,
31 0x48, 0xd9, 0x0b, 0x00, 0x00, 0x00, 0x01 },
32 .pt = (const u8[32]){ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
33 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
34 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
35 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
36 .ct = (const u8[32]){ 0x51, 0x04, 0xa1, 0x06, 0x16, 0x8a, 0x72, 0xd9,
37 0x79, 0x0d, 0x41, 0xee, 0x8e, 0xda, 0xd3, 0x88,
38 0xeb, 0x2e, 0x1e, 0xfc, 0x46, 0xda, 0x57, 0xc8,
39 0xfc, 0xe6, 0x30, 0xdf, 0x91, 0x41, 0xbe, 0x28 },
40 .data_len = 32 },
41 { .name = "RFC3686 Test Vector #3",
42 .key = (const u8[16]){ 0x76, 0x91, 0xbe, 0x03, 0x5e, 0x50, 0x20, 0xa8,
43 0xac, 0x6e, 0x61, 0x85, 0x29, 0xf9, 0xa0, 0xdc },
44 .iv = (const u8[16]){ 0x00, 0xe0, 0x01, 0x7b, 0x27, 0x77, 0x7f, 0x3f, 0x4a,
45 0x17, 0x86, 0xf0, 0x00, 0x00, 0x00, 0x01 },
46 .pt =
47 (const u8[36]){ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
48 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11,
49 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
50 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23 },
51 .ct =
52 (const u8[36]){ 0xc1, 0xcf, 0x48, 0xa8, 0x9f, 0x2f, 0xfd, 0xd9, 0xcf,
53 0x46, 0x52, 0xe9, 0xef, 0xdb, 0x72, 0xd7, 0x45, 0x40,
54 0xa4, 0x2b, 0xde, 0x6d, 0x78, 0x36, 0xd5, 0x9a, 0x5c,
55 0xea, 0xae, 0xf3, 0x10, 0x53, 0x25, 0xb2, 0x07, 0x2f },
56 .data_len = 36 },
57}, test_cases192[] = {
58 { .name = "RFC3686 Test Vector #4",
59 .key = (const u8[24]){ 0x16, 0xaf, 0x5b, 0x14, 0x5f, 0xc9, 0xf5, 0x79,
60 0xc1, 0x75, 0xf9, 0x3e, 0x3b, 0xfb, 0x0e, 0xed,
61 0x86, 0x3d, 0x06, 0xcc, 0xfd, 0xb7, 0x85, 0x15 },
62 .iv = (const u8[16]){ 0x00, 0x00, 0x00, 0x48, 0x36, 0x73, 0x3c, 0x14, 0x7d,
63 0x6d, 0x93, 0xcb, 0x00, 0x00, 0x00, 0x01 },
64 .pt = (const u8[16]){ 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x62, 0x6c,
65 0x6f, 0x63, 0x6b, 0x20, 0x6d, 0x73, 0x67 },
66 .ct = (const u8[16]){ 0x4b, 0x55, 0x38, 0x4f, 0xe2, 0x59, 0xc9, 0xc8, 0x4e,
67 0x79, 0x35, 0xa0, 0x03, 0xcb, 0xe9, 0x28 },
68 .data_len = 16 },
69 { .name = "RFC3686 Test Vector #5",
70 .key = (const u8[24]){ 0x7c, 0x5c, 0xb2, 0x40, 0x1b, 0x3d, 0xc3, 0x3c,
71 0x19, 0xe7, 0x34, 0x08, 0x19, 0xe0, 0xf6, 0x9c,
72 0x67, 0x8c, 0x3d, 0xb8, 0xe6, 0xf6, 0xa9, 0x1a },
73 .iv = (const u8[16]){ 0x00, 0x96, 0xb0, 0x3b, 0x02, 0x0c, 0x6e, 0xad, 0xc2,
74 0xcb, 0x50, 0x0d, 0x00, 0x00, 0x00, 0x01 },
75 .pt = (const u8[32]){ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
76 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
77 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
78 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
79 .ct = (const u8[32]){ 0x45, 0x32, 0x43, 0xfc, 0x60, 0x9b, 0x23, 0x32,
80 0x7e, 0xdf, 0xaa, 0xfa, 0x71, 0x31, 0xcd, 0x9f,
81 0x84, 0x90, 0x70, 0x1c, 0x5a, 0xd4, 0xa7, 0x9c,
82 0xfc, 0x1f, 0xe0, 0xff, 0x42, 0xf4, 0xfb, 0x00 },
83 .data_len = 32 },
84 { .name = "RFC3686 Test Vector #6",
85 .key = (const u8[24]){ 0x02, 0xBF, 0x39, 0x1E, 0xE8, 0xEC, 0xB1, 0x59,
86 0xB9, 0x59, 0x61, 0x7B, 0x09, 0x65, 0x27, 0x9B,
87 0xF5, 0x9B, 0x60, 0xA7, 0x86, 0xD3, 0xE0, 0xFE },
88 .iv = (const u8[16]){ 0x00, 0x07, 0xBD, 0xFD, 0x5C, 0xBD, 0x60, 0x27, 0x8D,
89 0xCC, 0x09, 0x12, 0x00, 0x00, 0x00, 0x01 },
90 .pt =
91 (const u8[36]){ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
92 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11,
93 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A,
94 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23 },
95 .ct =
96 (const u8[36]){ 0x96, 0x89, 0x3F, 0xC5, 0x5E, 0x5C, 0x72, 0x2F, 0x54,
97 0x0B, 0x7D, 0xD1, 0xDD, 0xF7, 0xE7, 0x58, 0xD2, 0x88,
98 0xBC, 0x95, 0xC6, 0x91, 0x65, 0x88, 0x45, 0x36, 0xC8,
99 0x11, 0x66, 0x2F, 0x21, 0x88, 0xAB, 0xEE, 0x09, 0x35 },
100 .data_len = 36 },
101
102}, test_cases256[] = {
103 { .name = "RFC3686 Test Vector #7",
104 .key = (const u8[32]){ 0x77, 0x6b, 0xef, 0xf2, 0x85, 0x1d, 0xb0, 0x6f,
105 0x4c, 0x8a, 0x05, 0x42, 0xc8, 0x69, 0x6f, 0x6c,
106 0x6a, 0x81, 0xaf, 0x1e, 0xec, 0x96, 0xb4, 0xd3,
107 0x7f, 0xc1, 0xd6, 0x89, 0xe6, 0xc1, 0xc1, 0x04 },
108 .iv = (const u8[16]){ 0x00, 0x00, 0x00, 0x60, 0xdb, 0x56, 0x72, 0xc9, 0x7a,
109 0xa8, 0xf0, 0xb2, 0x00, 0x00, 0x00, 0x01 },
110 .pt = (const u8 *) "Single block msg",
111 .ct = (const u8[16]){ 0x14, 0x5a, 0xd0, 0x1d, 0xbf, 0x82, 0x4e, 0xc7, 0x56,
112 0x08, 0x63, 0xdc, 0x71, 0xe3, 0xe0, 0xc0 },
113 .data_len = 16 },
114 { .name = "RFC3686 Test Vector #8",
115 .key = (const u8[32]){ 0xf6, 0xd6, 0x6d, 0x6b, 0xd5, 0x2d, 0x59, 0xbb,
116 0x07, 0x96, 0x36, 0x58, 0x79, 0xef, 0xf8, 0x86,
117 0xc6, 0x6d, 0xd5, 0x1a, 0x5b, 0x6a, 0x99, 0x74,
118 0x4b, 0x50, 0x59, 0x0c, 0x87, 0xa2, 0x38, 0x84 },
119 .iv = (const u8[16]){ 0x00, 0xfa, 0xac, 0x24, 0xc1, 0x58, 0x5e, 0xf1, 0x5a,
120 0x43, 0xd8, 0x75, 0x00, 0x00, 0x00, 0x01 },
121 .pt = (const u8[32]){ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
122 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
123 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
124 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f },
125 .ct = (const u8[32]){ 0xf0, 0x5e, 0x23, 0x1b, 0x38, 0x94, 0x61, 0x2c,
126 0x49, 0xee, 0x00, 0x0b, 0x80, 0x4e, 0xb2, 0xa9,
127 0xb8, 0x30, 0x6b, 0x50, 0x8f, 0x83, 0x9d, 0x6a,
128 0x55, 0x30, 0x83, 0x1d, 0x93, 0x44, 0xaf, 0x1c },
129 .data_len = 32 },
130 { .name = "RFC3686 Test Vector #9",
131 .key = (const u8[32]){ 0xff, 0x7a, 0x61, 0x7c, 0xe6, 0x91, 0x48, 0xe4,
132 0xf1, 0x72, 0x6e, 0x2f, 0x43, 0x58, 0x1d, 0xe2,
133 0xaa, 0x62, 0xd9, 0xf8, 0x05, 0x53, 0x2e, 0xdf,
134 0xf1, 0xee, 0xd6, 0x87, 0xfb, 0x54, 0x15, 0x3d },
135 .iv = (const u8[16]){ 0x00, 0x1c, 0xc5, 0xb7, 0x51, 0xa5, 0x1d, 0x70, 0xa1,
136 0xc1, 0x11, 0x48, 0x00, 0x00, 0x00, 0x01 },
137 .pt =
138 (const u8[36]){ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
139 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11,
140 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a,
141 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23 },
142 .ct =
143 (const u8[36]){ 0xeb, 0x6c, 0x52, 0x82, 0x1d, 0x0b, 0xbb, 0xf7, 0xce,
144 0x75, 0x94, 0x46, 0x2a, 0xca, 0x4f, 0xaa, 0xb4, 0x07,
145 0xdf, 0x86, 0x65, 0x69, 0xfd, 0x07, 0xf4, 0x8c, 0xc0,
146 0xb5, 0x83, 0xd6, 0x07, 0x1f, 0x1e, 0xc0, 0xe6, 0xb8 },
147 .data_len = 36 }
148};
149
150#define MAX_TEST_DATA_LEN 256
151
152#define INC_TEST_BYTES (256 * 16 + 1)
153
154static u8 inc_key128[] = {
155 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6,
156 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c,
157};
158
159static u8 inc_iv[] = {
160 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7,
161 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff,
162};
163
164static u64 inc_ct128[] = {
165 0xb77a659c70dd8dec, 0xebaf93e67e1cdbfa, 0x744766732f6e3a26,
166 0xb16d4de0cc6db900, 0x6811ac5c5be10d4a, 0x6b42973b30e29d96,
167 0xf1aec4c4ac0badd8, 0xc1955129e00b33ec, 0x49d7cf50bb054cf0,
168 0x4deb06dcdc7a21b8, 0xa257b4190916c808, 0x44b7d421c38b934b,
169 0x9e4dbb2d1aceb85b, 0x2d1c952f53c6000d, 0x7e25b633f3bceb0d,
170 0xcee9f88cd3c2236d, 0x10ce6bc4a53b1d37, 0xb4783ea69ebc261d,
171 0x7f732c19e5fdd3ea, 0xb253d0ebd5522c84, 0x7925888c44ef010d,
172 0xba213ea62e7ec7f0, 0x239e0466520393fd, 0x8cde31681d451842,
173 0x20b8270d3c5c1bc5, 0x3e56c37a1d573ebe, 0xc4fdb0bb491cf04e,
174 0x29c9a4f92d7b12da, 0x50c8a51f05b6f704, 0x3cf0f4071c2098fa,
175 0xb0842470bd8c6fdd, 0x86dd40fdc9640190, 0xe4a6184230ee4f6c,
176 0x0e2a69261819535e, 0xbdb62571c80aaa39, 0x24a0dc5eafd33f3a,
177 0x830599f37869c6ac, 0xf7049ae1b8e5c0dd, 0x7c9dd8d4405d2050,
178 0x0e91382b1dace623, 0xf2b62e26f4133673, 0xa9216257693afdab,
179 0x2a26df863fb6e980, 0x85e600421c395c83, 0xd5a521016a175cb3,
180 0x5ef31ae51f7f2f7b, 0xc6ff491d0d6f74d4, 0x16b0e60ac13156d3,
181 0xd49e0025d5ec1e4b, 0x987c4eff196cd64e, 0xa163915e80892b07,
182 0x69ab0084052d574a, 0x8017caa649d22bdb, 0xf5eb130f0df2c49a,
183 0xe2ced8f88537e9ea, 0xdaaff5e845cff681, 0xbd22ac46dd219c7a,
184 0x1b963af4641e7cf7, 0xe70e7d5b76f88573, 0x39703f5e2db84937,
185 0x8a1514af42bf3c96, 0x7f51d78b7d3971a6, 0x437a651ef9f08c08,
186 0x69fd3712ccdfd843, 0xd8204939e67dad48, 0x71035fc942194251,
187 0x703d964c7525bb2a, 0xe2166e50e1892d94, 0xbe8034b11f6a5a9f,
188 0x954e4d74c3a9e105, 0x19e077bf00e5186a, 0x7aee46c4b5d4cbf1,
189 0xfd7dedd15a3e7d35, 0x4ba1c4b76cb93f57, 0xb2e94cffbb82f098,
190 0x078b04fcebc1fafc, 0x923edcc8600018b2, 0xc018169aba42ff11,
191 0x0e4f91e46db01bf8, 0x7b5d2b322371e9fa, 0x8e94284632dd300b,
192 0x80a3d93ce61c2f13, 0x445d2fb83ecfef73, 0xe1279d639bcd26c9,
193 0xbd1865ba653ce114, 0x0316cfe3227bfb2a, 0xddc80c63d53878db,
194 0xc91a2f5fedf4a51a, 0xce408a5275b0271f, 0x59a0abc34619018e,
195 0xa215c590ad1afb21, 0xe3b096d42fc03598, 0x7cada064ab4f4997,
196 0x699be0e57d76e47f, 0x235151411eee9cbd, 0xbbc688f0eaf896cd,
197 0x4e78715341f9299d, 0x9f85d76bf99ef2a4, 0x15110ceff4a6040b,
198 0x9feed36ff4566060, 0x4833ea7d66a0c572, 0x94c7edbdf2169d59,
199 0xb413d116c6e771f1, 0x9a4b6e78167f4c66, 0x42d3f993c8aaee27,
200 0xd16783a8c4e57558, 0xb1d7a074dd67339e, 0x97a164444f97adc2,
201 0xc15a08d61628e5f3, 0x8767e41e04eb96a2, 0xbb28953ed0eae183,
202 0xc0bab4e80ed8cc6e, 0x1ac34b5a5c4010f8, 0x0bc3b7d9db1775b7,
203 0x565dead595b98969, 0x0fc03a3cfb656014, 0xdb9098b924a92926,
204 0xe2786bc431c1f39a, 0xf8a0bf4fffb78d10, 0xd76161fe1ae71851,
205 0xced33ea693cedbb4, 0xef13034da5529a1b, 0xd71081cadbbff0ac,
206 0x1873eb643e857392, 0xf6f7c30284ffecb0, 0x93ded259d35eb6fe,
207 0xf872980774f6e5ef, 0xd457c8ed22d5bc3f, 0x75d907e2a6bcced2,
208 0xcfd3dceb8d7a79ba, 0xaeed2ff2fc0872bb, 0xb5fc72005d2eb168,
209 0x850e0e0757274665, 0xab7e5da576c706ec, 0xf1df1ba9a972a4ca,
210 0xe81d430b4f54adf9, 0x788f3d8655ba79bb, 0xf5990db3557bbf8c,
211 0x1cacafc47729252c, 0x7581b4d6f3b83d9b, 0x94185dcdb0b0c4cd,
212 0x3596e687f4b9f4ed, 0xb9462442134b804d, 0xdab188808726fec6,
213 0xfe10831e8824d4c5, 0x000c641ed4c93be7, 0x2525ee781608b1ea,
214 0x2b32469d51104097, 0x73a09c6ea117aea9, 0x8506dcdec8ade0be,
215 0xf9f9fa553cac7285, 0x34b24f100086b974, 0xd42fa88547ade8e7,
216 0xfd0bb8ce9a5f8e14, 0x15df9966c6a3e433, 0xf6696aafaae89cd6,
217 0x3d521a9d1a0087e1, 0xe18ca6b8e94701f0, 0x8a4660e26a77965e,
218 0xc74fcdf41bf4aa20, 0x292a356d0b670157, 0x36ff3344a9eee4ea,
219 0xd76b051d6251a14b, 0xa9e09f1bacd1e30f, 0xae47cb95f95a8831,
220 0x58b85ac7c98537ec, 0x9e30f1be05719bd2, 0x94772e6b56fc1380,
221 0xbe94026a4a89b783, 0x7a7ffb61daa5ac60, 0x2f7beafcc5e9ac8a,
222 0xfa33f37edc57e94c, 0x230c3582fb412093, 0xdeec806ecc4fa3c4,
223 0xc7ff8876a31edd76, 0x6d0500f4ccd1bb20, 0xf1d0bef759b81b6c,
224 0x138b1d39533379b7, 0xece52f84d9f20455, 0x3ed05e391352b9dd,
225 0x95600f558d4dea51, 0x1d6b997966e35392, 0x0eeae16905b94e37,
226 0x7db2acc242a56ab0, 0xaf347e5598687f51, 0xbf25013db6bddc18,
227 0x6d4f106c35f9ee28, 0xc8e90bbe4283ab8c, 0x188cf978f1477dee,
228 0x66376bfa3a6d8131, 0xe0ebd6632eb89b24, 0xb9e49d81e9d37f69,
229 0xa5cfa3812d530e04, 0x717353523542a27f, 0x0d6669c916ab4d34,
230 0x79e741ad592a7bb1, 0x63a7f35584bd3ea5, 0xc0494db2930cbc32,
231 0x442bd29d7edd0e49, 0x52ec0bce733f61a0, 0x8bd199bf55bc2b4b,
232 0x727ede5583bb859c, 0x9d07eda6e8220df1, 0xebdd7467d7259f15,
233 0x8f6035a5dc5f53b1, 0x063a0935630b5f6f, 0xc6e983ec1f08ebe6,
234 0xeedc82de2b28e651, 0xe28760013e13ae23, 0x37c078d66ad376a3,
235 0xd54a72e88e80926b, 0x5822405e1d688eec, 0xa001e0b0d4a7447f,
236 0xfd41f41419d8fd4d, 0x1391d37127a75095, 0x4795d7fb7ad67f17,
237 0xa47c05c9b8400a0c, 0x28519cd5e98bba0c, 0x84a72dce8a27d050,
238 0xcbee7b3c83d68c5f, 0xab2227b8f5203d3d, 0x3335a393d47ef9ec,
239 0xd00b21a2a5dde597, 0xb13d50489ca79216, 0xde1cc721425dda94,
240 0x1ddc9863b5b0b8e8, 0xb125481a01dfe1b5, 0x5b331c746c4148db,
241 0x8d6729fe30d56f1d, 0xdc413723540aca6f, 0xf08fe55711f8f09b,
242 0x98bcde7c09126688, 0xa38c02a0c19d08b0, 0xde8df0683372e31e,
243 0x08b4727054d766a0, 0xc13b77c325ae45ed, 0x6e7fe05de6b28d5a,
244 0x1794a4f149586b9a, 0x23f5881c699f81b8, 0x355c9d899c0dcfe3,
245 0x4319acb92ca33a29, 0x4f3211554c2ecf79, 0x64741347e08aaa2f,
246 0x32f89bf1084e0723, 0xb0d5d830b9ae58a6, 0x235170babbd5686f,
247 0xaa711d0aff2e9830, 0x4f73229995f82ca2, 0x46565f056bb352ea,
248 0x55283776fd729f29, 0xb027c5b67be58718, 0xfa58d8c215d52ef8,
249 0xfa1a78f7c7db4b2f, 0x7b2badd9a5a7e810, 0x6c362d97ece0f08a,
250 0xff8ad11e7ce377b1, 0xdf5a423e843cbfa0, 0xfa9e70edc9c12d2b,
251 0xad745d9146b0b3d9, 0xfc2a590f1ce32b8c, 0x599b34c583449c39,
252 0xbcab9517d2bd4eae, 0xa5a7f54890e38bc7, 0xb9700fcb336a049a,
253 0xfcfcc2d65956af5f, 0x3887b5f3e5d238d6, 0x0b9bc00a60dd37c6,
254 0x09f8d5b6a128fe23, 0x4b33ac26a2a59b5c, 0xfc6e3f30b4b4e108,
255 0x1e53d6aa6266bee7, 0x9adf6b4cb3369643, 0xda38dfd6df234f48,
256 0x845e61ddc98d3d16, 0x4a0b90d7d115d701, 0x64e1c9619aa777c3,
257 0x9dd4b1df006c81f9, 0x71b2b88aea6c679e, 0xb39da7819be759ff,
258 0xfdad221790b269bb, 0x741f7955b56d786c, 0x5d724fcce9250a73,
259 0x3812aa144730905b, 0xb74986be047e24c4, 0xeebb8aa5ebdcc8a0,
260 0x26a0ea4272d5a371, 0x2ff3733c39e92f82, 0x17880beb7b808b30,
261 0xe298cf8aa284e39c, 0xd481ff1948d0eef0, 0xed53786d517a1f10,
262 0x853ccfe7f1cba481, 0x9ba1707467deb6dc, 0xf1aae1c3190806b3,
263 0xb017539bb50b55c4, 0x8809bcc37ac46808, 0x0ae0a3e6e9a6bba5,
264 0xf7a5276c2a6df772, 0xaf095d1ceb24d931, 0xaa0f62c5eb44d3a6,
265 0x5e9915d18cd09844, 0xcfff6a2edf6cd35f, 0x893ebc1038af747e,
266 0xe4360da910f3853a, 0x2097129be26812d5, 0x09d1e31bd3fef181,
267 0x37a585c49cff87c5, 0xd94d2b3b1cd97311, 0xa3a2d50de285388a,
268 0xf627d8b7298602a0, 0x567f848218395a28, 0x9b4b416995765491,
269 0x24388b443fd8730a, 0x5b3a3cc87e225bdb, 0x53a9881d098d520b,
270 0xadbc31258140299f, 0x37345aad0c678a3f, 0xc0e24ea3958ef6d8,
271 0x18ceff669a144d20, 0x3ce920ab86ab70c7, 0x430c240b5307c1cb,
272 0x7240a314d5f7fa9c, 0x4dfaf972d1856f15, 0x76ca74db2ad10515,
273 0x607ec82965c620f7, 0xc75f531d7eae4145, 0xe91c86c49c8d84a2,
274 0x8becf71fe1e371a7, 0x055bb0206808c289, 0x36dbcec66eabc566,
275 0x476f4f1b52c4c856, 0x78bdf9114304e28f, 0x206e8342087ca6e2,
276 0xda66f574514e8795, 0x903bcf41830a763f, 0x3a8c03f8bfe8c1ae,
277 0xc386671f05740107, 0xda3abc3b566c70ab, 0xe1072ad4ebd4a028,
278 0xfe9a6d4c0e8a80ce, 0xeb99eb25a084c442, 0xd34f23f8f279e9f3,
279 0xccb189048479b94d, 0xfc6f6d863f74a049, 0xa437f340bfdfed0e,
280 0xc84ef9a7139af764, 0xbeb88737819b7d55, 0x5f06fb8f06d6372b,
281 0x7ec01ec2f978b4a2, 0x1ad4f2fb9963b46f, 0xae4cdeee5c419652,
282 0x51ee340ba106d1dc, 0x93544a6e274cf180, 0x0de0b1abf6e9773a,
283 0xb55514c7be768e6a, 0x70a3ee12298c0688, 0x58943a332454b1ee,
284 0xe9de88a863b83b29, 0xb99dbf02fc35d6c9, 0x285a09f5583ac480,
285 0xd0bf2b79a453c915, 0xb6e140e86dcb97d5, 0x8de0ab74f93a8de1,
286 0x70f9bb989ce46c09, 0xd7ea17d64158d923, 0x308e3f8a527d0ff7,
287 0xa0fffd413b3a872f, 0xcd35b4b30dfb6587, 0x7ef3ab8b9bd5fbcf,
288 0x6149f604d9f355f7, 0x130d9020814780cd, 0x45cb969837f9a147,
289 0x88dc31c106a2345e, 0x690da693a3472e6d, 0xe1dc49aaab6d8504,
290 0x7749dc54f0a8f838, 0x358a1197921ed6e3, 0x50ae914d7b26c811,
291 0x6e0f79b3af64d1ad, 0xec45b7e54c408577, 0x94809242f830a52f,
292 0x88e8c0701fd8cd25, 0x21f562f903b85ca7, 0x3f8f1d2cfd57d394,
293 0x1f0db9fb1767b393, 0x0504a2b6a6b967d3, 0xf18209ff9dee356b,
294 0x4e74343f94f09cff, 0x53107e4bd79b52c1, 0x9c4ab4cdba0f0c2f,
295 0xfd085f652a3c3f14, 0xcbd20129e019e573, 0x92d2e7681d64d41b,
296 0xfa6c6c50db35a8fd, 0x7dc5177e0cc57261, 0xae3586379eed9e9d,
297 0x4ba340964a014d54, 0x57147f7d60a4a5ee, 0x423255e50fec612e,
298 0x1c1158e2a2afbace, 0x5e0dd39d591b341f, 0x4e0fff62124939a6,
299 0x12e0413146fa5c8d, 0x3a6e0c37d48699a0, 0x9774260521aa490f,
300 0xbd0f8ecc2b447c99, 0x556d41deab48dad8, 0x08bd36a5be98bc97,
301 0x8bf0c22eb1cb99a0, 0x959954221670e572, 0x05143412beae5a0c,
302 0x37246cbdf96ede32, 0xeb05ce52c11ab210, 0xd4e9c130ccd17048,
303 0x42cc9b6177b7547b, 0x96d603334e7a85c7, 0x850365d5d2f5adcb,
304 0xcfa11346e834516c, 0xfb9e30870be0c7bb, 0xc4d137ab85224e7a,
305 0xc7f20e98475c4ab3, 0xaf464d45151fec79, 0xe4ad336a38569bcd,
306 0xabd20fbf84b809bd, 0xb3643ed21050862a, 0xfb29924632f30a27,
307 0x3f4fd0809492521f, 0xcc9635ff080ba76d, 0xeb679199764753a7,
308 0x9df2de103f532b81, 0x83784f41703f0a31, 0x70ba6c249783efba,
309 0x93cf542badd6d441, 0x8290f3e7b7fcc9a6, 0xb55485e8fadf4677,
310 0xf29c554f7e99c1de, 0x277a3a2d674f10e9, 0xe9a5460c4d87bd2a,
311 0x0d8489866023402a, 0x6bd7d212c07df415, 0x8d6194cb592bebc3,
312 0xa9747f53b4cd4192, 0x56bd4c4c6373dcb9, 0x3385c9e222966cb2,
313 0x234bda6863a4f7fd, 0xebc79b310f06f538, 0x3b7556403468fc38,
314 0x9ac05c55de908490, 0x381dba9f8e05fd0e, 0x5e92d1853484e36a,
315 0x030782801735585f, 0xd8c76845c71a4482, 0xea03ea2ec2406c9b,
316 0xe2498a52f95cd21e, 0xd4ffe046d9393212, 0x93565efec984c6c9,
317 0x154c50d8c6e11dc9, 0x3cd889f3188c18cc, 0xb5a46a6cba1287ca,
318 0xbc203b6c8f21bb66, 0xfedf97cba4c35dea, 0x0c82b3d9520de017,
319 0xdb2674b14ddb4d95, 0x44c8e1ca851db784, 0x5596d3e27d211d55,
320 0x9dbe804695d2270d, 0xbd54af74b050b82a, 0xe4ea34515f120cea,
321 0xaa2564472972ab58, 0xf97af0d678dfd0cb, 0xdebdbc18d6c71bd1,
322 0x78423e11438fcb21, 0xf6f749d4f30510d4, 0x68de10085ea4c2ea,
323 0x6b3ff4773ccb4ec1, 0x33206eb82742f50e, 0x3046468ab04a0778,
324 0xd7168cc59b78654c, 0xcb5800e03e2f90d9, 0x4f8fdaa4a3b0b5ff,
325 0xe0eeff2c2ff94e64, 0x7f2578708dafae2e, 0x6feab0ef729b4300,
326 0xf1de49e2796cfdf5, 0x90711a9f7886a0d0, 0xf4b39401ae61d28a,
327 0x3f26008ddcbc47e9, 0xfab0a15c25a8511d, 0x2664fc987e7fdd17,
328 0x51125228da560a04, 0x93a545c6207a3d67, 0x7c8e4446a408cc25,
329 0xf9b10a00083f429e, 0x48704b0fc020d66c, 0x1e1a8c7a3d66eae0,
330 0x9bde8e4692e41915, 0x7144aad3cf672129, 0xbab5e713e8f5b335,
331 0x2d2c0b70c55d7d11, 0xed928a6e1b388ab0, 0xf121a4a71653448f,
332 0x0dd175d00c20e9ed, 0xe68066507fb5dcb1, 0x92384f914830a50e,
333 0xb4d4c84f220aed3d, 0xa13e4d6ea70cc5f0, 0xfdbe2223195bfa82,
334 0xe97bb465c3ca2099, 0x0078ec86e8daa6c0, 0x634c3a1311b805c4,
335 0xac04a89119ae79a7, 0x690e7049d8e8762f, 0x0000000000000086,
336 0x0000000000000000,
337};
338
339#define perftest_aesXXX_var_sz(a) \
340 void __test_perf_fn perftest_aes##a##_var_sz (test_perf_t *tp) \
341 { \
342 u32 n = tp->n_ops; \
343 aes_ctr_key_data_t *kd = test_mem_alloc (sizeof (*kd)); \
344 u8 *dst = test_mem_alloc (n + 16); \
345 u8 *src = test_mem_alloc_and_fill_inc_u8 (n + 16, 0, 0); \
346 u8 *key = test_mem_alloc_and_fill_inc_u8 (32, 192, 0); \
347 u8 *iv = test_mem_alloc_and_fill_inc_u8 (16, 128, 0); \
348 \
349 clib_aes_ctr_key_expand (kd, key, AES_KEY_##a); \
350 \
351 test_perf_event_enable (tp); \
352 clib_aes##a##_ctr (kd, src, n, iv, dst); \
353 test_perf_event_disable (tp); \
354 }
355
356static clib_error_t *
357test_clib_aes128_ctr (clib_error_t *err)
358{
359 aes_ctr_key_data_t kd;
360 aes_ctr_ctx_t ctx;
361 u8 pt[INC_TEST_BYTES];
362 u8 ct[INC_TEST_BYTES];
363
364 FOREACH_ARRAY_ELT (tc, test_cases128)
365 {
366 clib_aes_ctr_key_expand (&kd, tc->key, AES_KEY_128);
367 clib_aes128_ctr (&kd, tc->pt, tc->data_len, tc->iv, ct);
368
369 if (tc->data_len && memcmp (tc->ct, ct, tc->data_len) != 0)
370 return clib_error_return (err, "%s: invalid ciphertext", tc->name);
371 }
372
373 for (int i = 0; i < sizeof (pt); i++)
374 pt[i] = i;
375
376 clib_aes_ctr_key_expand (&kd, inc_key128, AES_KEY_128);
377 clib_aes128_ctr (&kd, pt, INC_TEST_BYTES, inc_iv, ct);
378 for (int i = 0; i < sizeof (pt); i++)
379 if (((u8 *) inc_ct128)[i] != ct[i])
380 return clib_error_return (err, "incremental test failed (byte %u)", i);
381
382 clib_aes_ctr_init (&ctx, &kd, inc_iv, AES_KEY_128);
383 for (u32 off = 0, chunk_size = 1; off < INC_TEST_BYTES;
384 off += chunk_size, chunk_size = clib_min (((chunk_size + 1) * 2 - 1),
385 INC_TEST_BYTES - off))
386 clib_aes_ctr_transform (&ctx, pt + off, ct + off, chunk_size, AES_KEY_128);
387
388 for (int i = 0; i < sizeof (pt); i++)
389 if (((u8 *) inc_ct128)[i] != ct[i])
390 return clib_error_return (
391 err, "incremental multiseg test failed (byte %u)", i);
392
393 return err;
394}
395
396perftest_aesXXX_var_sz (128);
397REGISTER_TEST (clib_aes128_ctr) = {
398 .name = "clib_aes128_ctr",
399 .fn = test_clib_aes128_ctr,
400 .perf_tests = PERF_TESTS ({ .name = "variable size (per byte)",
401 .n_ops = 1424,
402 .fn = perftest_aes128_var_sz },
403 { .name = "variable size (per byte)",
404 .n_ops = 1 << 20,
405 .fn = perftest_aes128_var_sz }),
406};
407
408static clib_error_t *
409test_clib_aes192_ctr (clib_error_t *err)
410{
411 aes_ctr_key_data_t kd;
412 u8 ct[MAX_TEST_DATA_LEN];
413
414 FOREACH_ARRAY_ELT (tc, test_cases192)
415 {
416 clib_aes_ctr_key_expand (&kd, tc->key, AES_KEY_192);
417 clib_aes192_ctr (&kd, tc->pt, tc->data_len, tc->iv, ct);
418
419 if (tc->data_len && memcmp (tc->ct, ct, tc->data_len) != 0)
420 return clib_error_return (err, "%s: invalid ciphertext", tc->name);
421 }
422
423 return err;
424}
425
426perftest_aesXXX_var_sz (192);
427REGISTER_TEST (clib_aes192_ctr) = {
428 .name = "clib_aes192_ctr",
429 .fn = test_clib_aes192_ctr,
430 .perf_tests = PERF_TESTS ({ .name = "variable size (per byte)",
431 .n_ops = 1424,
432 .fn = perftest_aes192_var_sz },
433 { .name = "variable size (per byte)",
434 .n_ops = 1 << 20,
435 .fn = perftest_aes192_var_sz }),
436};
437
438static clib_error_t *
439test_clib_aes256_ctr (clib_error_t *err)
440{
441 aes_ctr_key_data_t kd;
442 u8 ct[MAX_TEST_DATA_LEN];
443
444 FOREACH_ARRAY_ELT (tc, test_cases256)
445 {
446 aes_ctr_ctx_t ctx;
447 u32 sz = tc->data_len / 3;
448
449 clib_aes_ctr_key_expand (&kd, tc->key, AES_KEY_256);
450 clib_aes256_ctr (&kd, tc->pt, tc->data_len, tc->iv, ct);
451
452 if (tc->data_len && memcmp (tc->ct, ct, tc->data_len) != 0)
453 return clib_error_return (err, "%s: invalid ciphertext", tc->name);
454 clib_memset (ct, 0, tc->data_len);
455
456 clib_aes_ctr_init (&ctx, &kd, tc->iv, AES_KEY_256);
457 clib_aes_ctr_transform (&ctx, tc->pt, ct, sz, AES_KEY_256);
458 clib_aes_ctr_transform (&ctx, tc->pt + sz, ct + sz, sz, AES_KEY_256);
459 clib_aes_ctr_transform (&ctx, tc->pt + 2 * sz, ct + 2 * sz,
460 tc->data_len - 2 * sz, AES_KEY_256);
461 if (tc->data_len && memcmp (tc->ct, ct, tc->data_len) != 0)
462 return clib_error_return (err, "%s: invalid ciphertext (multiseg)",
463 tc->name);
464 }
465
466 return err;
467}
468
469perftest_aesXXX_var_sz (256);
470REGISTER_TEST (clib_aes256_ctr) = {
471 .name = "clib_aes256_ctr",
472 .fn = test_clib_aes256_ctr,
473 .perf_tests = PERF_TESTS ({ .name = "variable size (per byte)",
474 .n_ops = 1424,
475 .fn = perftest_aes256_var_sz },
476 { .name = "variable size (per byte)",
477 .n_ops = 1 << 20,
478 .fn = perftest_aes256_var_sz }),
479};
480
481#endif