aead_aes256gcm2.c (13946B)
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 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 268 main(void) 269 { 270 if (crypto_aead_aes256gcm_is_available()) { 271 tv(); 272 } 273 printf("OK\n"); 274 275 return 0; 276 }