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()));
+  }
+}