external/boringssl: Sync to 8625ec4b436ccb4098ed4aac10891eff8372be41.
This includes the following changes:
https://boringssl.googlesource.com/boringssl/+log/c596415ec62b501523d80f9afa26b135406da6bf..8625ec4b436ccb4098ed4aac10891eff8372be41
Test: cts -m CtsLibcoreTestCases
Change-Id: I47a45e6b6f46b19fcbcb6c917895867d56dcd2ca
diff --git a/src/crypto/fipsmodule/aes/aes_test.cc b/src/crypto/fipsmodule/aes/aes_test.cc
index 73ae255..ccec597 100644
--- a/src/crypto/fipsmodule/aes/aes_test.cc
+++ b/src/crypto/fipsmodule/aes/aes_test.cc
@@ -13,6 +13,7 @@
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
#include <memory>
@@ -25,6 +26,7 @@
#include "../../internal.h"
#include "../../test/file_test.h"
#include "../../test/test_util.h"
+#include "../../test/wycheproof_util.h"
static void TestRaw(FileTest *t) {
@@ -129,3 +131,58 @@
}
});
}
+
+TEST(AESTest, WycheproofKeyWrap) {
+ FileTestGTest("third_party/wycheproof_testvectors/kw_test.txt",
+ [](FileTest *t) {
+ std::string key_size;
+ ASSERT_TRUE(t->GetInstruction(&key_size, "keySize"));
+ std::vector<uint8_t> ct, key, msg;
+ ASSERT_TRUE(t->GetBytes(&ct, "ct"));
+ ASSERT_TRUE(t->GetBytes(&key, "key"));
+ ASSERT_TRUE(t->GetBytes(&msg, "msg"));
+ ASSERT_EQ(static_cast<unsigned>(atoi(key_size.c_str())), key.size() * 8);
+ WycheproofResult result;
+ ASSERT_TRUE(GetWycheproofResult(t, &result));
+
+ if (result != WycheproofResult::kInvalid) {
+ ASSERT_GE(ct.size(), 8u);
+
+ AES_KEY aes;
+ ASSERT_EQ(0, AES_set_decrypt_key(key.data(), 8 * key.size(), &aes));
+ std::vector<uint8_t> out(ct.size() - 8);
+ int len = AES_unwrap_key(&aes, nullptr, out.data(), ct.data(), ct.size());
+ ASSERT_EQ(static_cast<int>(out.size()), len);
+ EXPECT_EQ(Bytes(msg), Bytes(out));
+
+ out.resize(msg.size() + 8);
+ ASSERT_EQ(0, AES_set_encrypt_key(key.data(), 8 * key.size(), &aes));
+ len = AES_wrap_key(&aes, nullptr, out.data(), msg.data(), msg.size());
+ ASSERT_EQ(static_cast<int>(out.size()), len);
+ EXPECT_EQ(Bytes(ct), Bytes(out));
+ } else {
+ AES_KEY aes;
+ ASSERT_EQ(0, AES_set_decrypt_key(key.data(), 8 * key.size(), &aes));
+ std::vector<uint8_t> out(ct.size() < 8 ? 0 : ct.size() - 8);
+ int len = AES_unwrap_key(&aes, nullptr, out.data(), ct.data(), ct.size());
+ EXPECT_EQ(-1, len);
+ }
+ });
+}
+
+TEST(AESTest, WrapBadLengths) {
+ uint8_t key[128/8] = {0};
+ AES_KEY aes;
+ ASSERT_EQ(0, AES_set_encrypt_key(key, 128, &aes));
+
+ // Input lengths to |AES_wrap_key| must be a multiple of 8 and at least 16.
+ static const size_t kLengths[] = {0, 1, 2, 3, 4, 5, 6, 7, 8,
+ 9, 10, 11, 12, 13, 14, 15, 20};
+ for (size_t len : kLengths) {
+ SCOPED_TRACE(len);
+ std::vector<uint8_t> in(len);
+ std::vector<uint8_t> out(len + 8);
+ EXPECT_EQ(-1,
+ AES_wrap_key(&aes, nullptr, out.data(), in.data(), in.size()));
+ }
+}