// Copyright (c) 2017 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "quiche/quic/core/crypto/aes_256_gcm_encrypter.h" #include <memory> #include <string> #include "absl/base/macros.h" #include "absl/strings/escaping.h" #include "absl/strings/string_view.h" #include "quiche/quic/core/quic_utils.h" #include "quiche/quic/platform/api/quic_test.h" #include "quiche/quic/test_tools/quic_test_utils.h" #include "quiche/common/test_tools/quiche_test_utils.h" namespace { // The AES GCM test vectors come from the file gcmEncryptExtIV256.rsp // downloaded from // https://csrc.nist.gov/Projects/Cryptographic-Algorithm-Validation-Program/CAVP-TESTING-BLOCK-CIPHER-MODES#GCMVS // on 2017-09-27. The test vectors in that file look like this: // // [Keylen = 256] // [IVlen = 96] // [PTlen = 0] // [AADlen = 0] // [Taglen = 128] // // Count = 0 // Key = b52c505a37d78eda5dd34f20c22540ea1b58963cf8e5bf8ffa85f9f2492505b4 // IV = 516c33929df5a3284ff463d7 // PT = // AAD = // CT = // Tag = bdc1ac884d332457a1d2664f168c76f0 // // Count = 1 // Key = 5fe0861cdc2690ce69b3658c7f26f8458eec1c9243c5ba0845305d897e96ca0f // IV = 770ac1a5a3d476d5d96944a1 // PT = // AAD = // CT = // Tag = 196d691e1047093ca4b3d2ef4baba216 // // ... // // The gcmEncryptExtIV256.rsp file is huge (3.2 MB), so a few test vectors were // selected for this unit test. // Describes a group of test vectors that all have a given key length, IV // length, plaintext length, AAD length, and tag length. struct TestGroupInfo { … }; // Each test vector consists of six strings of lowercase hexadecimal digits. // The strings may be empty (zero length). A test vector with a nullptr |key| // marks the end of an array of test vectors. struct TestVector { … }; const TestGroupInfo test_group_info[] = …; const TestVector test_group_0[] = …; const TestVector test_group_1[] = …; const TestVector test_group_2[] = …; const TestVector test_group_3[] = …; const TestVector test_group_4[] = …; const TestVector test_group_5[] = …; const TestVector* const test_group_array[] = …; } // namespace namespace quic { namespace test { // EncryptWithNonce wraps the |Encrypt| method of |encrypter| to allow passing // in an nonce and also to allocate the buffer needed for the ciphertext. QuicData* EncryptWithNonce(Aes256GcmEncrypter* encrypter, absl::string_view nonce, absl::string_view associated_data, absl::string_view plaintext) { … } class Aes256GcmEncrypterTest : public QuicTest { … }; TEST_F(Aes256GcmEncrypterTest, Encrypt) { … } TEST_F(Aes256GcmEncrypterTest, GetMaxPlaintextSize) { … } TEST_F(Aes256GcmEncrypterTest, GetCiphertextSize) { … } TEST_F(Aes256GcmEncrypterTest, GenerateHeaderProtectionMask) { … } } // namespace test } // namespace quic