1 
2 #define TEST_NAME "aead_aes256gcm2"
3 #include "cmptest.h"
4 
5 static struct {
6     const char *key_hex;
7     const char  nonce_hex[crypto_aead_aes256gcm_NPUBBYTES * 2 + 1];
8     const char *ad_hex;
9     const char *message_hex;
10     const char *detached_ciphertext_hex;
11     const char  mac_hex[crypto_aead_aes256gcm_ABYTES * 2 + 1];
12     const char *outcome;
13 } tests[] = {
14     { "92ace3e348cd821092cd921aa3546374299ab46209691bc28b8752d17f123c20",
15       "00112233445566778899aabb", "00000000ffffffff", "00010203040506070809",
16       "e27abdd2d2a53d2f136b", "9a4a2579529301bcfb71c78d4060f52c", "valid" },
17     { "29d3a44f8723dc640239100c365423a312934ac80239212ac3df3421a2098123",
18       "00112233445566778899aabb", "aabbccddeeff", "", "",
19       "2a7d77fa526b8250cb296078926b5020", "valid" },
20     { "cc56b680552eb75008f5484b4cb803fa5063ebd6eab91f6ab6aef4916a766273",
21       "99e23ec48985bccdeeab60f1", "", "2a", "06",
22       "633c1e9703ef744ffffb40edf9d14355", "valid" },
23     { "51e4bf2bad92b7aff1a4bc05550ba81df4b96fabf41c12c7b00e60e48db7e152",
24       "4f07afedfdc3b6c2361823d3", "", "be3308f72a2c6aed", "cf332a12fdee800b",
25       "602e8d7c4799d62c140c9bb834876b09", "valid" },
26     { "67119627bd988eda906219e08c0d0d779a07d208ce8a4fe0709af755eeec6dcb",
27       "68ab7fdbf61901dad461d23c", "", "51f8c1f731ea14acdb210a6d973e07",
28       "43fc101bff4b32bfadd3daf57a590e", "ec04aacb7148a8b8be44cb7eaf4efa69",
29       "valid" },
30     { "59d4eafb4de0cfc7d3db99a8f54b15d7b39f0acc8da69763b019c1699f87674a",
31       "2fcb1b38a99e71b84740ad9b", "", "549b365af913f3b081131ccb6b825588",
32       "f58c16690122d75356907fd96b570fca", "28752c20153092818faba2a334640d6e",
33       "valid" },
34     { "3b2458d8176e1621c0cc24c0c0e24c1e80d72f7ee9149a4b166176629616d011",
35       "45aaa3e5d16d2d42dc03445d", "", "3ff1514b1c503915918f0c0c31094a6e1f",
36       "73a6b6f45f6ccc5131e07f2caa1f2e2f56", "2d7379ec1db5952d4e95d30c340b1b1d",
37       "valid" },
38     { "0212a8de5007ed87b33f1a7090b6114f9e08cefd9607f2c276bdcfdbc5ce9cd7",
39       "e6b1adf2fd58a8762c65f31b", "",
40       "10f1ecf9c60584665d9ae5efe279e7f7377eea6916d2b111",
41       "0843fff52d934fc7a071ea62c0bd351ce85678cde3ea2c9e",
42       "7355fde599006715053813ce696237a8", "valid" },
43     { "b279f57e19c8f53f2f963f5f2519fdb7c1779be2ca2b3ae8e1128b7d6c627fc4",
44       "98bc2c7438d5cd7665d76f6e", "c0",
45       "fcc515b294408c8645c9183e3f4ecee5127846d1",
46       "eb5500e3825952866d911253f8de860c00831c81",
47       "ecb660e1fb0541ec41e8d68a64141b3a", "valid" },
48     { "cdccfe3f46d782ef47df4e72f0c02d9c7f774def970d23486f11a57f54247f17",
49       "376187894605a8d45e30de51", "956846a209e087ed",
50       "e28e0e9f9d22463ac0e42639b530f42102fded75",
51       "feca44952447015b5df1f456df8ca4bb4eee2ce2",
52       "082e91924deeb77880e1b1c84f9b8d30", "valid" },
53     { "f32364b1d339d82e4f132d8f4a0ec1ff7e746517fa07ef1a7f422f4e25a48194",
54       "5a86a50a0e8a179c734b996d", "ab2ac7c44c60bdf8228c7884adb20184",
55       "43891bccb522b1e72a6b53cf31c074e9d6c2df8e",
56       "43dda832e942e286da314daa99bef5071d9d2c78",
57       "c3922583476ced575404ddb85dd8cd44", "valid" },
58     { "ff0089ee870a4a39f645b0a5da774f7a5911e9696fc9cad646452c2aa8595a12",
59       "bc2a7757d0ce2d8b1f14ccd9",
60       "972ab4e06390caae8f99dd6e2187be6c7ff2c08a24be16ef",
61       "748b28031621d95ee61812b4b4f47d04c6fc2ff3",
62       "a929ee7e67c7a2f91bbcec6389a3caf43ab49305",
63       "ebec6774b955e789591c822dab739e12", "valid" },
64     { "00112233445566778899aabbccddeeff102132435465768798a9bacbdcedfe0f",
65       "000000000000000000000000", "", "561008fa07a68f5c61285cd013464eaf",
66       "23293e9b07ca7d1b0cae7cc489a973b3", "ffffffffffffffffffffffffffffffff",
67       "valid" },
68     { "00112233445566778899aabbccddeeff102132435465768798a9bacbdcedfe0f",
69       "ffffffffffffffffffffffff", "", "c6152244cea1978d3e0bc274cf8c0b3b",
70       "7cb6fc7c6abc009efe9551a99f36a421", "00000000000000000000000000000000",
71       "valid" },
72     { "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
73       "505152535455565758595a5b", "", "202122232425262728292a2b2c2d2e2f",
74       "b2061457c0759fc1749f174ee1ccadfa", "9de8fef6d8ab1bf1bf887232eab590dd",
75       "invalid" },
76     { "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
77       "505152535455565758595a5b", "", "202122232425262728292a2b2c2d2e2f",
78       "b2061457c0759fc1749f174ee1ccadfa", "9ee8fef6d8ab1bf1bf887232eab590dd",
79       "invalid" },
80     { "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
81       "505152535455565758595a5b", "", "202122232425262728292a2b2c2d2e2f",
82       "b2061457c0759fc1749f174ee1ccadfa", "1ce8fef6d8ab1bf1bf887232eab590dd",
83       "invalid" },
84     { "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
85       "505152535455565758595a5b", "", "202122232425262728292a2b2c2d2e2f",
86       "b2061457c0759fc1749f174ee1ccadfa", "9ce9fef6d8ab1bf1bf887232eab590dd",
87       "invalid" },
88     { "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
89       "505152535455565758595a5b", "", "202122232425262728292a2b2c2d2e2f",
90       "b2061457c0759fc1749f174ee1ccadfa", "9ce8fe76d8ab1bf1bf887232eab590dd",
91       "invalid" },
92     { "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
93       "505152535455565758595a5b", "", "202122232425262728292a2b2c2d2e2f",
94       "b2061457c0759fc1749f174ee1ccadfa", "9ce8fef6d9ab1bf1bf887232eab590dd",
95       "invalid" },
96     { "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
97       "505152535455565758595a5b", "", "202122232425262728292a2b2c2d2e2f",
98       "b2061457c0759fc1749f174ee1ccadfa", "9ce8fef6daab1bf1bf887232eab590dd",
99       "invalid" },
100     { "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
101       "505152535455565758595a5b", "", "202122232425262728292a2b2c2d2e2f",
102       "b2061457c0759fc1749f174ee1ccadfa", "9ce8fef6d8ab1b71bf887232eab590dd",
103       "invalid" },
104     { "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
105       "505152535455565758595a5b", "", "202122232425262728292a2b2c2d2e2f",
106       "b2061457c0759fc1749f174ee1ccadfa", "9ce8fef6d8ab1bf1be887232eab590dd",
107       "invalid" },
108     { "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
109       "505152535455565758595a5b", "", "202122232425262728292a2b2c2d2e2f",
110       "b2061457c0759fc1749f174ee1ccadfa", "9ce8fef6d8ab1bf13f887232eab590dd",
111       "invalid" },
112     { "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
113       "505152535455565758595a5b", "", "202122232425262728292a2b2c2d2e2f",
114       "b2061457c0759fc1749f174ee1ccadfa", "9ce8fef6d8ab1bf1bfa87232eab590dd",
115       "invalid" },
116     { "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
117       "505152535455565758595a5b", "", "202122232425262728292a2b2c2d2e2f",
118       "b2061457c0759fc1749f174ee1ccadfa", "9ce8fef6d8ab1bf1bf887332eab590dd",
119       "invalid" },
120     { "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
121       "505152535455565758595a5b", "", "202122232425262728292a2b2c2d2e2f",
122       "b2061457c0759fc1749f174ee1ccadfa", "9ce8fef6d8ab1bf1bf887232ebb590dd",
123       "invalid" },
124     { "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
125       "505152535455565758595a5b", "", "202122232425262728292a2b2c2d2e2f",
126       "b2061457c0759fc1749f174ee1ccadfa", "9ce8fef6d8ab1bf1bf887232e8b590dd",
127       "invalid" },
128     { "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
129       "505152535455565758595a5b", "", "202122232425262728292a2b2c2d2e2f",
130       "b2061457c0759fc1749f174ee1ccadfa", "9ce8fef6d8ab1bf1bf8872326ab590dd",
131       "invalid" },
132     { "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
133       "505152535455565758595a5b", "", "202122232425262728292a2b2c2d2e2f",
134       "b2061457c0759fc1749f174ee1ccadfa", "9ce8fef6d8ab1bf1bf887232eab590dc",
135       "invalid" },
136     { "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
137       "505152535455565758595a5b", "", "202122232425262728292a2b2c2d2e2f",
138       "b2061457c0759fc1749f174ee1ccadfa", "9ce8fef6d8ab1bf1bf887232eab590df",
139       "invalid" },
140     { "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
141       "505152535455565758595a5b", "", "202122232425262728292a2b2c2d2e2f",
142       "b2061457c0759fc1749f174ee1ccadfa", "9ce8fef6d8ab1bf1bf887232eab5909d",
143       "invalid" },
144     { "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
145       "505152535455565758595a5b", "", "202122232425262728292a2b2c2d2e2f",
146       "b2061457c0759fc1749f174ee1ccadfa", "9ce8fef6d8ab1bf1bf887232eab5905d",
147       "invalid" },
148     { "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
149       "505152535455565758595a5b", "", "202122232425262728292a2b2c2d2e2f",
150       "b2061457c0759fc1749f174ee1ccadfa", "9de8fef6d8ab1bf1be887232eab590dd",
151       "invalid" },
152     { "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
153       "505152535455565758595a5b", "", "202122232425262728292a2b2c2d2e2f",
154       "b2061457c0759fc1749f174ee1ccadfa", "9ce8fe76d8ab1b71bf887232eab590dd",
155       "invalid" },
156     { "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
157       "505152535455565758595a5b", "", "202122232425262728292a2b2c2d2e2f",
158       "b2061457c0759fc1749f174ee1ccadfa", "9ce8fef6d8ab1b71bf887232eab5905d",
159       "invalid" },
160     { "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
161       "505152535455565758595a5b", "", "202122232425262728292a2b2c2d2e2f",
162       "b2061457c0759fc1749f174ee1ccadfa", "631701092754e40e40778dcd154a6f22",
163       "invalid" },
164     { "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
165       "505152535455565758595a5b", "", "202122232425262728292a2b2c2d2e2f",
166       "b2061457c0759fc1749f174ee1ccadfa", "00000000000000000000000000000000",
167       "invalid" },
168     { "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
169       "505152535455565758595a5b", "", "202122232425262728292a2b2c2d2e2f",
170       "b2061457c0759fc1749f174ee1ccadfa", "ffffffffffffffffffffffffffffffff",
171       "invalid" },
172     { "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
173       "505152535455565758595a5b", "", "202122232425262728292a2b2c2d2e2f",
174       "b2061457c0759fc1749f174ee1ccadfa", "1c687e76582b9b713f08f2b26a35105d",
175       "invalid" },
176     { "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
177       "505152535455565758595a5b", "", "202122232425262728292a2b2c2d2e2f",
178       "b2061457c0759fc1749f174ee1ccadfa", "9de9fff7d9aa1af0be897333ebb491dc",
179       "invalid" }
180 };
181 
182 static int
tv(void)183 tv(void)
184 {
185     unsigned char *ad;
186     unsigned char *decrypted;
187     unsigned char *detached_ciphertext;
188     unsigned char *key;
189     unsigned char *message;
190     unsigned char *mac;
191     unsigned char *nonce;
192     size_t         ad_len;
193     size_t         detached_ciphertext_len;
194     size_t         message_len;
195     unsigned int   i;
196 
197     key   = (unsigned char *) sodium_malloc(crypto_aead_aes256gcm_KEYBYTES);
198     nonce = (unsigned char *) sodium_malloc(crypto_aead_aes256gcm_NPUBBYTES);
199     mac   = (unsigned char *) sodium_malloc(crypto_aead_aes256gcm_ABYTES);
200 
201     for (i = 0U; i < (sizeof tests) / (sizeof tests[0]); i++) {
202         assert(strlen(tests[i].key_hex) == 2 * crypto_aead_aes256gcm_KEYBYTES);
203         sodium_hex2bin(key, crypto_aead_aes256gcm_KEYBYTES, tests[i].key_hex,
204                        strlen(tests[i].key_hex), NULL, NULL, NULL);
205 
206         assert(strlen(tests[i].nonce_hex) ==
207                2 * crypto_aead_aes256gcm_NPUBBYTES);
208         sodium_hex2bin(nonce, crypto_aead_aes256gcm_NPUBBYTES,
209                        tests[i].nonce_hex, strlen(tests[i].nonce_hex), NULL,
210                        NULL, NULL);
211 
212         message_len = strlen(tests[i].message_hex) / 2;
213         message     = (unsigned char *) sodium_malloc(message_len);
214         sodium_hex2bin(message, message_len, tests[i].message_hex,
215                        strlen(tests[i].message_hex), NULL, NULL, NULL);
216 
217         ad_len = strlen(tests[i].ad_hex) / 2;
218         ad     = (unsigned char *) sodium_malloc(ad_len);
219         sodium_hex2bin(ad, ad_len, tests[i].ad_hex, strlen(tests[i].ad_hex),
220                        NULL, NULL, NULL);
221 
222         detached_ciphertext_len = message_len;
223         assert(strlen(tests[i].detached_ciphertext_hex) == 2 * message_len);
224         assert(strlen(tests[i].mac_hex) == 2 * crypto_aead_aes256gcm_ABYTES);
225         sodium_hex2bin(mac, crypto_aead_aes256gcm_ABYTES, tests[i].mac_hex,
226                        strlen(tests[i].mac_hex), NULL, NULL, NULL);
227 
228         detached_ciphertext =
229             (unsigned char *) sodium_malloc(detached_ciphertext_len);
230         sodium_hex2bin(detached_ciphertext, detached_ciphertext_len,
231                        tests[i].detached_ciphertext_hex,
232                        strlen(tests[i].detached_ciphertext_hex), NULL, NULL,
233                        NULL);
234 
235         decrypted = (unsigned char *) sodium_malloc(message_len);
236         if (crypto_aead_aes256gcm_decrypt_detached(
237                 decrypted, NULL, detached_ciphertext, detached_ciphertext_len,
238                 mac, ad, ad_len, nonce, key) == 0) {
239             if (strcmp(tests[i].outcome, "valid") != 0) {
240                 printf("*** test case %u succeeded, was supposed to be %s\n", i,
241                        tests[i].outcome);
242             }
243             if (memcmp(decrypted, message, message_len) != 0) {
244                 printf("Incorrect decryption of test vector #%u\n",
245                        (unsigned int) i);
246             }
247         } else {
248             if (strcmp(tests[i].outcome, "invalid") != 0) {
249                 printf("*** test case %u failed, was supposed to be %s\n", i,
250                        tests[i].outcome);
251             }
252         }
253 
254         sodium_free(message);
255         sodium_free(ad);
256         sodium_free(decrypted);
257         sodium_free(detached_ciphertext);
258     }
259 
260     sodium_free(key);
261     sodium_free(mac);
262     sodium_free(nonce);
263 
264     return 0;
265 }
266 
267 int
main(void)268 main(void)
269 {
270     if (crypto_aead_aes256gcm_is_available()) {
271         tv();
272     }
273     printf("OK\n");
274 
275     return 0;
276 }
277