23 #include <gtest/gtest.h>
29 #include "../../internal.h"
30 #include "../../test/abi_test.h"
31 #include "../../test/file_test.h"
32 #include "../../test/test_util.h"
33 #include "../../test/wycheproof_util.h"
76 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6, 0xa6,
85 <<
"Invalid Plaintext and Ciphertext lengths.";
155 if (t->GetParameter() ==
"Raw") {
157 }
else if (t->GetParameter() ==
"KeyWrap") {
159 }
else if (t->GetParameter() ==
"KeyWrapWithPadding") {
160 TestKeyWrapWithPadding(t);
162 ADD_FAILURE() <<
"Unknown mode " << t->GetParameter();
167 TEST(AESTest, WycheproofKeyWrap) {
168 FileTestGTest(
"third_party/wycheproof_testvectors/kw_test.txt",
171 ASSERT_TRUE(t->GetInstruction(&key_size,
"keySize"));
172 std::vector<uint8_t> ct,
key,
msg;
176 ASSERT_EQ(
static_cast<unsigned>(atoi(key_size.c_str())),
key.size() * 8);
185 std::vector<uint8_t>
out(ct.size() - 8);
190 out.resize(
msg.size() + 8);
198 std::vector<uint8_t>
out(ct.size() < 8 ? 0 : ct.size() - 8);
205 TEST(AESTest, WycheproofKeyWrapWithPadding) {
206 FileTestGTest(
"third_party/wycheproof_testvectors/kwp_test.txt",
209 ASSERT_TRUE(t->GetInstruction(&key_size,
"keySize"));
210 std::vector<uint8_t> ct,
key,
msg;
214 ASSERT_EQ(
static_cast<unsigned>(atoi(key_size.c_str())),
key.size() * 8);
225 if (
result.IsValid({
"SmallKey",
"WeakWrapping"}) && !
msg.empty()) {
228 std::vector<uint8_t>
out(ct.size() - 8);
231 ct.data(), ct.size()));
234 out.resize(
msg.size() + 15);
242 std::vector<uint8_t>
out(ct.size());
245 ct.data(), ct.size()));
250 TEST(AESTest, WrapBadLengths) {
256 static const size_t kLengths[] = {0, 1, 2, 3, 4, 5, 6, 7, 8,
257 9, 10, 11, 12, 13, 14, 15, 20};
258 for (
size_t len : kLengths) {
260 std::vector<uint8_t>
in(
len);
261 std::vector<uint8_t>
out(
len + 8);
267 TEST(AESTest, InvalidKeySize) {
268 static const uint8_t kZero[8] = {0};
274 #if defined(SUPPORTS_ABI_TEST)
276 for (
int bits : {128, 192, 256}) {
282 std::vector<int> block_counts;
284 block_counts = {0, 1, 2, 3, 4, 8, 16, 31};
288 block_counts = {0, 1, 8};
294 for (
size_t blocks : block_counts) {
303 for (
size_t blocks : block_counts) {
313 for (
size_t blocks : block_counts) {
315 #if defined(VPAES_CBC)
319 #if defined(VPAES_CTR32)
326 #if defined(VPAES_CBC)
327 for (
size_t blocks : block_counts) {
338 for (
size_t blocks : block_counts) {
343 #if defined(HWAES_ECB)
351 for (
size_t blocks : block_counts) {
355 #if defined(HWAES_ECB)
363 #endif // SUPPORTS_ABI_TEST
365 #if defined(BSAES) && !defined(BORINGSSL_SHARED_LIBRARY)
371 static const uint8_t kSBox[256] = {
372 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b,
373 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
374 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26,
375 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
376 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2,
377 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
378 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed,
379 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
380 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f,
381 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
382 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec,
383 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
384 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14,
385 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
386 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d,
387 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
388 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f,
389 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
390 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11,
391 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
392 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f,
393 0xb0, 0x54, 0xbb, 0x16,
403 return a0 | (
a1 << 8) | (
a2 << 16) | (a3 << 24);
406 static int aes_ref_set_encrypt_key(
const uint8_t *
key,
int key_bits,
408 static const uint32_t kRCon[10] = {0x01, 0x02, 0x04, 0x08, 0x10,
409 0x20, 0x40, 0x80, 0x1b, 0x36};
424 size_t words = key_bits / 32;
425 size_t num_subkey_words = (
out->rounds + 1) * 4;
427 for (
size_t i =
words;
i < num_subkey_words;
i++) {
431 }
else if (key_bits == 256 &&
i % 4 == 0) {
432 tmp = aes_ref_sub_word(
tmp);
438 for (
size_t i = 0;
i < num_subkey_words;
i++) {
481 static const uint32_t kInvMixColumn[256] = {
482 0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927,
483 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45,
484 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb,
485 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381,
486 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf,
487 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66,
488 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28,
489 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012,
490 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec,
491 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e,
492 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd,
493 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7,
494 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89,
495 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b,
496 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815,
497 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f,
498 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa,
499 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8,
500 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36,
501 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c,
502 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742,
503 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea,
504 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4,
505 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e,
506 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360,
507 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502,
508 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87,
509 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd,
510 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3,
511 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621,
512 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f,
513 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55,
514 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26,
515 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844,
516 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba,
517 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480,
518 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce,
519 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67,
520 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929,
521 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713,
522 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed,
523 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f,
524 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3};
528 for (
size_t i = 0;
i < 4;
i++) {
538 if (aes_ref_set_encrypt_key(
key,
bits,
out) != 0) {
544 for (
size_t i = 0;
i <
out->rounds / 2;
i++) {
553 for (
size_t i = 1;
i <
out->rounds;
i++) {
554 aes_ref_inv_mix_columns(
out->rd_key + 4 *
i);
561 TEST(AESTest, VPAESToBSAESConvert) {
562 const int kNumIterations = 1000;
563 for (
int i = 0;
i < kNumIterations;
i++) {
567 for (
unsigned bits : {128
u, 192
u, 256
u}) {
569 for (
bool enc : {
false,
true}) {
603 #endif // BSAES && !SHARED_LIBRARY