crypto_ipsecmb: CBC IV size is always equal to block size
[vpp.git] / src / plugins / unittest / crypto / aes_gcm.c
1 /*
2  * Copyright (c) 2019 Cisco and/or its affiliates.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at:
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15
16 /* Test vectors published in GCM Specification */
17
18 #include <vppinfra/clib.h>
19 #include <vnet/crypto/crypto.h>
20 #include <unittest/crypto/crypto.h>
21
22 static u8 tc6_iv[] = {
23   0x93, 0x13, 0x22, 0x5d, 0xf8, 0x84, 0x06, 0xe5,
24   0x55, 0x90, 0x9c, 0x5a, 0xff, 0x52, 0x69, 0xaa,
25   0x6a, 0x7a, 0x95, 0x38, 0x53, 0x4f, 0x7d, 0xa1,
26   0xe4, 0xc3, 0x03, 0xd2, 0xa3, 0x18, 0xa7, 0x28,
27   0xc3, 0xc0, 0xc9, 0x51, 0x56, 0x80, 0x95, 0x39,
28   0xfc, 0xf0, 0xe2, 0x42, 0x9a, 0x6b, 0x52, 0x54,
29   0x16, 0xae, 0xdb, 0xf5, 0xa0, 0xde, 0x6a, 0x57,
30   0xa6, 0x37, 0xb3, 0x9b
31 };
32
33 static u8 tc6_plaintext[] = {
34   0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5,
35   0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a,
36   0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
37   0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72,
38   0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53,
39   0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
40   0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57,
41   0xba, 0x63, 0x7b, 0x39,
42 };
43
44 static u8 tc6_key[] = {
45   0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
46   0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08
47 };
48
49 static u8 tc6_aad[] = {
50   0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
51   0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
52   0xab, 0xad, 0xda, 0xd2
53 };
54
55 static u8 tc6_ciphertext[] = {
56   0x8c, 0xe2, 0x49, 0x98, 0x62, 0x56, 0x15, 0xb6,
57   0x03, 0xa0, 0x33, 0xac, 0xa1, 0x3f, 0xb8, 0x94,
58   0xbe, 0x91, 0x12, 0xa5, 0xc3, 0xa2, 0x11, 0xa8,
59   0xba, 0x26, 0x2a, 0x3c, 0xca, 0x7e, 0x2c, 0xa7,
60   0x01, 0xe4, 0xa9, 0xa4, 0xfb, 0xa4, 0x3c, 0x90,
61   0xcc, 0xdc, 0xb2, 0x81, 0xd4, 0x8c, 0x7c, 0x6f,
62   0xd6, 0x28, 0x75, 0xd2, 0xac, 0xa4, 0x17, 0x03,
63   0x4c, 0x34, 0xae, 0xe5
64 };
65
66 static u8 tc6_tag[] = {
67   0x61, 0x9c, 0xc5, 0xae, 0xff, 0xfe, 0x0b, 0xfa,
68   0x46, 0x2a, 0xf4, 0x3c, 0x16, 0x99, 0xd0, 0x50,
69 };
70
71 /* *INDENT-OFF* */
72 UNITTEST_REGISTER_CRYPTO_TEST (aes_gcm_tc6) = {
73   .name = "128-GCM Spec. TC6",
74   .alg = VNET_CRYPTO_ALG_AES_128_GCM,
75   .iv = TEST_DATA (tc6_iv),
76   .key = TEST_DATA (tc6_key),
77   .plaintext = TEST_DATA (tc6_plaintext),
78   .ciphertext = TEST_DATA (tc6_ciphertext),
79   .tag = TEST_DATA (tc6_tag),
80   .aad = TEST_DATA (tc6_aad),
81 };
82
83 /* *INDENT-ON* */
84
85 static u8 tc5_iv[] = {
86   0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad
87 };
88
89 static u8 tc5_ciphertext[] = {
90   0x61, 0x35, 0x3b, 0x4c, 0x28, 0x06, 0x93, 0x4a,
91   0x77, 0x7f, 0xf5, 0x1f, 0xa2, 0x2a, 0x47, 0x55,
92   0x69, 0x9b, 0x2a, 0x71, 0x4f, 0xcd, 0xc6, 0xf8,
93   0x37, 0x66, 0xe5, 0xf9, 0x7b, 0x6c, 0x74, 0x23,
94   0x73, 0x80, 0x69, 0x00, 0xe4, 0x9f, 0x24, 0xb2,
95   0x2b, 0x09, 0x75, 0x44, 0xd4, 0x89, 0x6b, 0x42,
96   0x49, 0x89, 0xb5, 0xe1, 0xeb, 0xac, 0x0f, 0x07,
97   0xc2, 0x3f, 0x45, 0x98
98 };
99
100 static u8 tc5_tag[] = {
101   0x36, 0x12, 0xd2, 0xe7, 0x9e, 0x3b, 0x07, 0x85,
102   0x56, 0x1b, 0xe1, 0x4a, 0xac, 0xa2, 0xfc, 0xcb
103 };
104
105 /* *INDENT-OFF* */
106 UNITTEST_REGISTER_CRYPTO_TEST (aes_gcm_tc5) = {
107   .name = "128-GCM Spec. TC5",
108   .alg = VNET_CRYPTO_ALG_AES_128_GCM,
109   .iv = TEST_DATA (tc5_iv),
110   .key = TEST_DATA (tc6_key),
111   .plaintext = TEST_DATA (tc6_plaintext),
112   .ciphertext = TEST_DATA (tc5_ciphertext),
113   .tag = TEST_DATA (tc5_tag),
114   .aad = TEST_DATA (tc6_aad),
115 };
116 /* *INDENT-ON* */
117
118 static u8 tc4_iv[] = {
119   0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad,
120   0xde, 0xca, 0xf8, 0x88
121 };
122
123 static u8 tc4_ciphertext[] = {
124   0x42, 0x83, 0x1e, 0xc2, 0x21, 0x77, 0x74, 0x24,
125   0x4b, 0x72, 0x21, 0xb7, 0x84, 0xd0, 0xd4, 0x9c,
126   0xe3, 0xaa, 0x21, 0x2f, 0x2c, 0x02, 0xa4, 0xe0,
127   0x35, 0xc1, 0x7e, 0x23, 0x29, 0xac, 0xa1, 0x2e,
128   0x21, 0xd5, 0x14, 0xb2, 0x54, 0x66, 0x93, 0x1c,
129   0x7d, 0x8f, 0x6a, 0x5a, 0xac, 0x84, 0xaa, 0x05,
130   0x1b, 0xa3, 0x0b, 0x39, 0x6a, 0x0a, 0xac, 0x97,
131   0x3d, 0x58, 0xe0, 0x91
132 };
133
134 static u8 tc4_tag[] = {
135   0x5b, 0xc9, 0x4f, 0xbc, 0x32, 0x21, 0xa5, 0xdb,
136   0x94, 0xfa, 0xe9, 0x5a, 0xe7, 0x12, 0x1a, 0x47
137 };
138
139 /* *INDENT-OFF* */
140 UNITTEST_REGISTER_CRYPTO_TEST (aes_gcm_tc4) = {
141   .name = "128-GCM Spec. TC4",
142   .alg = VNET_CRYPTO_ALG_AES_128_GCM,
143   .iv = TEST_DATA (tc4_iv),
144   .key = TEST_DATA (tc6_key),
145   .plaintext = TEST_DATA (tc6_plaintext),
146   .ciphertext = TEST_DATA (tc4_ciphertext),
147   .tag = TEST_DATA (tc4_tag),
148   .aad = TEST_DATA (tc6_aad),
149 };
150 /* *INDENT-ON* */
151
152 static u8 tc3_plaintext[] = {
153   0xd9, 0x31, 0x32, 0x25, 0xf8, 0x84, 0x06, 0xe5,
154   0xa5, 0x59, 0x09, 0xc5, 0xaf, 0xf5, 0x26, 0x9a,
155   0x86, 0xa7, 0xa9, 0x53, 0x15, 0x34, 0xf7, 0xda,
156   0x2e, 0x4c, 0x30, 0x3d, 0x8a, 0x31, 0x8a, 0x72,
157   0x1c, 0x3c, 0x0c, 0x95, 0x95, 0x68, 0x09, 0x53,
158   0x2f, 0xcf, 0x0e, 0x24, 0x49, 0xa6, 0xb5, 0x25,
159   0xb1, 0x6a, 0xed, 0xf5, 0xaa, 0x0d, 0xe6, 0x57,
160   0xba, 0x63, 0x7b, 0x39, 0x1a, 0xaf, 0xd2, 0x55
161 };
162
163 static u8 tc3_ciphertext[] = {
164   0x42, 0x83, 0x1e, 0xc2, 0x21, 0x77, 0x74, 0x24,
165   0x4b, 0x72, 0x21, 0xb7, 0x84, 0xd0, 0xd4, 0x9c,
166   0xe3, 0xaa, 0x21, 0x2f, 0x2c, 0x02, 0xa4, 0xe0,
167   0x35, 0xc1, 0x7e, 0x23, 0x29, 0xac, 0xa1, 0x2e,
168   0x21, 0xd5, 0x14, 0xb2, 0x54, 0x66, 0x93, 0x1c,
169   0x7d, 0x8f, 0x6a, 0x5a, 0xac, 0x84, 0xaa, 0x05,
170   0x1b, 0xa3, 0x0b, 0x39, 0x6a, 0x0a, 0xac, 0x97,
171   0x3d, 0x58, 0xe0, 0x91, 0x47, 0x3f, 0x59, 0x85
172 };
173
174 static u8 tc3_tag[] = {
175   0x4d, 0x5c, 0x2a, 0xf3, 0x27, 0xcd, 0x64, 0xa6,
176   0x2c, 0xf3, 0x5a, 0xbd, 0x2b, 0xa6, 0xfa, 0xb4
177 };
178
179 /* *INDENT-OFF* */
180 UNITTEST_REGISTER_CRYPTO_TEST (aes_gcm_tc3) = {
181   .name = "128-GCM Spec. TC3",
182   .alg = VNET_CRYPTO_ALG_AES_128_GCM,
183   .iv = TEST_DATA (tc4_iv),
184   .key = TEST_DATA (tc6_key),
185   .plaintext = TEST_DATA (tc3_plaintext),
186   .ciphertext = TEST_DATA (tc3_ciphertext),
187   .tag = TEST_DATA (tc3_tag),
188 };
189 /* *INDENT-ON* */
190
191 static u8 tc2_key[16] = { 0, };
192 static u8 tc2_iv[12] = { 0, };
193 static u8 tc2_plaintext[16] = { 0, };
194
195 static u8 tc2_tag[] = {
196   0xab, 0x6e, 0x47, 0xd4, 0x2c, 0xec, 0x13, 0xbd,
197   0xf5, 0x3a, 0x67, 0xb2, 0x12, 0x57, 0xbd, 0xdf
198 };
199
200 static u8 tc2_ciphertext[] = {
201   0x03, 0x88, 0xda, 0xce, 0x60, 0xb6, 0xa3, 0x92,
202   0xf3, 0x28, 0xc2, 0xb9, 0x71, 0xb2, 0xfe, 0x78
203 };
204
205 /* *INDENT-OFF* */
206 UNITTEST_REGISTER_CRYPTO_TEST (aes_gcm_tc2) = {
207   .name = "128-GCM Spec. TC2",
208   .alg = VNET_CRYPTO_ALG_AES_128_GCM,
209   .iv = TEST_DATA (tc2_iv),
210   .key = TEST_DATA (tc2_key),
211   .plaintext = TEST_DATA (tc2_plaintext),
212   .ciphertext = TEST_DATA (tc2_ciphertext),
213   .tag = TEST_DATA (tc2_tag),
214 };
215 /* *INDENT-ON* */
216
217 static u8 tc1_tag[] = {
218   0x58, 0xe2, 0xfc, 0xce, 0xfa, 0x7e, 0x30, 0x61,
219   0x36, 0x7f, 0x1d, 0x57, 0xa4, 0xe7, 0x45, 0x5a
220 };
221
222 /* *INDENT-OFF* */
223 UNITTEST_REGISTER_CRYPTO_TEST (aes_gcm_tc1) = {
224   .name = "128-GCM Spec. TC1",
225   .alg = VNET_CRYPTO_ALG_AES_128_GCM,
226   .iv = TEST_DATA (tc2_iv),
227   .key = TEST_DATA (tc2_key),
228   .tag = TEST_DATA (tc1_tag),
229 };
230 /* *INDENT-ON* */
231
232 static u8 tc1_256_key[32] = { 0, };
233
234 static u8 tc1_256_tag[] = {
235   0x53, 0x0f, 0x8a, 0xfb, 0xc7, 0x45, 0x36, 0xb9,
236   0xa9, 0x63, 0xb4, 0xf1, 0xc4, 0xcb, 0x73, 0x8b,
237 };
238
239 /* *INDENT-OFF* */
240 UNITTEST_REGISTER_CRYPTO_TEST (aes_gcm256_tc1) = {
241   .name = "256-GCM Spec. TC1",
242   .alg = VNET_CRYPTO_ALG_AES_256_GCM,
243   .key = TEST_DATA (tc1_256_key),
244   .iv = TEST_DATA (tc2_iv),
245   .tag = TEST_DATA (tc1_256_tag),
246 };
247 /* *INDENT-ON* */
248
249 static u8 tc2_256_ciphertext[] = {
250   0xce, 0xa7, 0x40, 0x3d, 0x4d, 0x60, 0x6b, 0x6e,
251   0x07, 0x4e, 0xc5, 0xd3, 0xba, 0xf3, 0x9d, 0x18
252 };
253
254 static u8 tc2_256_tag[] = {
255   0xd0, 0xd1, 0xc8, 0xa7, 0x99, 0x99, 0x6b, 0xf0,
256   0x26, 0x5b, 0x98, 0xb5, 0xd4, 0x8a, 0xb9, 0x19
257 };
258
259 /* *INDENT-OFF* */
260 UNITTEST_REGISTER_CRYPTO_TEST (aes_gcm256_tc2) = {
261   .name = "256-GCM Spec. TC2",
262   .alg = VNET_CRYPTO_ALG_AES_256_GCM,
263   .key = TEST_DATA (tc1_256_key),
264   .iv = TEST_DATA (tc2_iv),
265   .plaintext = TEST_DATA(tc2_plaintext),
266   .ciphertext = TEST_DATA(tc2_256_ciphertext),
267   .tag = TEST_DATA (tc2_256_tag),
268 };
269 /* *INDENT-ON* */
270
271 static u8 tc3_256_key[] = {
272   0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
273   0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08,
274   0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
275   0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08
276 };
277
278 static u8 tc3_256_ciphertext[] = {
279   0x52, 0x2d, 0xc1, 0xf0, 0x99, 0x56, 0x7d, 0x07,
280   0xf4, 0x7f, 0x37, 0xa3, 0x2a, 0x84, 0x42, 0x7d,
281   0x64, 0x3a, 0x8c, 0xdc, 0xbf, 0xe5, 0xc0, 0xc9,
282   0x75, 0x98, 0xa2, 0xbd, 0x25, 0x55, 0xd1, 0xaa,
283   0x8c, 0xb0, 0x8e, 0x48, 0x59, 0x0d, 0xbb, 0x3d,
284   0xa7, 0xb0, 0x8b, 0x10, 0x56, 0x82, 0x88, 0x38,
285   0xc5, 0xf6, 0x1e, 0x63, 0x93, 0xba, 0x7a, 0x0a,
286   0xbc, 0xc9, 0xf6, 0x62, 0x89, 0x80, 0x15, 0xad
287 };
288
289 static u8 tc3_256_tag[] = {
290   0xb0, 0x94, 0xda, 0xc5, 0xd9, 0x34, 0x71, 0xbd,
291   0xec, 0x1a, 0x50, 0x22, 0x70, 0xe3, 0xcc, 0x6c
292 };
293
294 /* *INDENT-OFF* */
295 UNITTEST_REGISTER_CRYPTO_TEST (aes_gcm256_tc3) = {
296   .name = "256-GCM Spec. TC3",
297   .alg = VNET_CRYPTO_ALG_AES_256_GCM,
298   .key = TEST_DATA (tc3_256_key),
299   .iv = TEST_DATA (tc4_iv),
300   .plaintext = TEST_DATA(tc3_plaintext),
301   .ciphertext = TEST_DATA(tc3_256_ciphertext),
302   .tag = TEST_DATA (tc3_256_tag),
303 };
304 /* *INDENT-ON* */
305
306 static u8 tc4_256_ciphertext[] = {
307   0x52, 0x2d, 0xc1, 0xf0, 0x99, 0x56, 0x7d, 0x07,
308   0xf4, 0x7f, 0x37, 0xa3, 0x2a, 0x84, 0x42, 0x7d,
309   0x64, 0x3a, 0x8c, 0xdc, 0xbf, 0xe5, 0xc0, 0xc9,
310   0x75, 0x98, 0xa2, 0xbd, 0x25, 0x55, 0xd1, 0xaa,
311   0x8c, 0xb0, 0x8e, 0x48, 0x59, 0x0d, 0xbb, 0x3d,
312   0xa7, 0xb0, 0x8b, 0x10, 0x56, 0x82, 0x88, 0x38,
313   0xc5, 0xf6, 0x1e, 0x63, 0x93, 0xba, 0x7a, 0x0a,
314   0xbc, 0xc9, 0xf6, 0x62
315 };
316
317 static u8 tc4_256_tag[] = {
318   0x76, 0xfc, 0x6e, 0xce, 0x0f, 0x4e, 0x17, 0x68,
319   0xcd, 0xdf, 0x88, 0x53, 0xbb, 0x2d, 0x55, 0x1b
320 };
321
322 /* *INDENT-OFF* */
323 UNITTEST_REGISTER_CRYPTO_TEST (aes_gcm256_tc4) = {
324   .name = "256-GCM Spec. TC4",
325   .alg = VNET_CRYPTO_ALG_AES_256_GCM,
326   .key = TEST_DATA (tc3_256_key),
327   .iv = TEST_DATA (tc4_iv),
328   .plaintext = TEST_DATA(tc6_plaintext),
329   .ciphertext = TEST_DATA(tc4_256_ciphertext),
330   .aad = TEST_DATA(tc6_aad),
331   .tag = TEST_DATA (tc4_256_tag),
332 };
333 /* *INDENT-ON* */
334
335 static u8 tc5_256_ciphertext[] = {
336   0xc3, 0x76, 0x2d, 0xf1, 0xca, 0x78, 0x7d, 0x32,
337   0xae, 0x47, 0xc1, 0x3b, 0xf1, 0x98, 0x44, 0xcb,
338   0xaf, 0x1a, 0xe1, 0x4d, 0x0b, 0x97, 0x6a, 0xfa,
339   0xc5, 0x2f, 0xf7, 0xd7, 0x9b, 0xba, 0x9d, 0xe0,
340   0xfe, 0xb5, 0x82, 0xd3, 0x39, 0x34, 0xa4, 0xf0,
341   0x95, 0x4c, 0xc2, 0x36, 0x3b, 0xc7, 0x3f, 0x78,
342   0x62, 0xac, 0x43, 0x0e, 0x64, 0xab, 0xe4, 0x99,
343   0xf4, 0x7c, 0x9b, 0x1f
344 };
345
346 static u8 tc5_256_tag[] = {
347   0x3a, 0x33, 0x7d, 0xbf, 0x46, 0xa7, 0x92, 0xc4,
348   0x5e, 0x45, 0x49, 0x13, 0xfe, 0x2e, 0xa8, 0xf2
349 };
350
351 /* *INDENT-OFF* */
352 UNITTEST_REGISTER_CRYPTO_TEST (aes_gcm256_tc5) = {
353   .name = "256-GCM Spec. TC5",
354   .alg = VNET_CRYPTO_ALG_AES_256_GCM,
355   .key = TEST_DATA (tc3_256_key),
356   .iv = TEST_DATA (tc5_iv),
357   .plaintext = TEST_DATA(tc6_plaintext),
358   .ciphertext = TEST_DATA(tc5_256_ciphertext),
359   .aad = TEST_DATA(tc6_aad),
360   .tag = TEST_DATA (tc5_256_tag),
361 };
362 /* *INDENT-ON* */
363
364 static u8 tc6_256_ciphertext[] = {
365   0x5a, 0x8d, 0xef, 0x2f, 0x0c, 0x9e, 0x53, 0xf1,
366   0xf7, 0x5d, 0x78, 0x53, 0x65, 0x9e, 0x2a, 0x20,
367   0xee, 0xb2, 0xb2, 0x2a, 0xaf, 0xde, 0x64, 0x19,
368   0xa0, 0x58, 0xab, 0x4f, 0x6f, 0x74, 0x6b, 0xf4,
369   0x0f, 0xc0, 0xc3, 0xb7, 0x80, 0xf2, 0x44, 0x45,
370   0x2d, 0xa3, 0xeb, 0xf1, 0xc5, 0xd8, 0x2c, 0xde,
371   0xa2, 0x41, 0x89, 0x97, 0x20, 0x0e, 0xf8, 0x2e,
372   0x44, 0xae, 0x7e, 0x3f
373 };
374
375 static u8 tc6_256_tag[] = {
376   0xa4, 0x4a, 0x82, 0x66, 0xee, 0x1c, 0x8e, 0xb0,
377   0xc8, 0xb5, 0xd4, 0xcf, 0x5a, 0xe9, 0xf1, 0x9a
378 };
379
380 /* *INDENT-OFF* */
381 UNITTEST_REGISTER_CRYPTO_TEST (aes_gcm256_tc6) = {
382   .name = "256-GCM Spec. TC6",
383   .alg = VNET_CRYPTO_ALG_AES_256_GCM,
384   .key = TEST_DATA (tc3_256_key),
385   .iv = TEST_DATA (tc6_iv),
386   .plaintext = TEST_DATA(tc6_plaintext),
387   .ciphertext = TEST_DATA(tc6_256_ciphertext),
388   .aad = TEST_DATA(tc6_aad),
389   .tag = TEST_DATA (tc6_256_tag),
390 };
391 /* *INDENT-ON* */
392
393 /*
394  * fd.io coding-style-patch-verification: ON
395  *
396  * Local Variables:
397  * eval: (c-set-style "gnu")
398  * End:
399  */