blob: 89cfd5eba5d9ade39191d217d269beb4fb492db3 [file] [log] [blame]
// Copyright 2018 The Fuchsia 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 "garnet/lib/overnet/packet_protocol/aead_codec.h"
#include <random>
#include "gtest/gtest.h"
namespace overnet {
namespace aead_codec_test {
struct TestArgs {
const EVP_AEAD* aead;
std::vector<uint64_t> seqs;
Slice payload;
};
class AEADCodec : public ::testing::TestWithParam<TestArgs> {};
TEST_P(AEADCodec, Basics) {
std::vector<uint8_t> key;
std::random_device rng;
for (size_t i = 0; i < EVP_AEAD_key_length(GetParam().aead); i++) {
key.push_back(rng());
}
const char* ad = "HELLO!";
overnet::AEADCodec codec1(GetParam().aead, key.data(), key.size(),
reinterpret_cast<const uint8_t*>(ad), strlen(ad));
overnet::AEADCodec codec2(GetParam().aead, key.data(), key.size(),
reinterpret_cast<const uint8_t*>(ad), strlen(ad));
std::vector<Slice> encoded;
for (uint64_t seq : GetParam().seqs) {
auto enc = codec1.Encode(seq, GetParam().payload);
ASSERT_TRUE(enc.is_ok()) << enc;
encoded.push_back(*enc);
EXPECT_NE(*enc, GetParam().payload);
auto dec = codec2.Decode(seq, *enc);
ASSERT_TRUE(dec.is_ok()) << dec;
EXPECT_NE(*dec, encoded.back());
EXPECT_EQ(*dec, GetParam().payload);
}
for (size_t i = 0; i < encoded.size(); i++) {
for (size_t j = i + 1; j < encoded.size(); j++) {
EXPECT_NE(encoded[i], encoded[j]) << "i=" << i << " j=" << j;
}
}
}
const auto kTestCases = [] {
std::vector<TestArgs> out;
for (auto aead : {
EVP_aead_aes_128_gcm(),
EVP_aead_aes_256_gcm(),
EVP_aead_chacha20_poly1305(),
EVP_aead_xchacha20_poly1305(),
EVP_aead_aes_128_ctr_hmac_sha256(),
EVP_aead_aes_256_ctr_hmac_sha256(),
EVP_aead_aes_128_gcm_siv(),
EVP_aead_aes_256_gcm_siv(),
}) {
out.push_back(TestArgs{aead,
{1, 2, 3, 5, 8, 13, 21, 34},
Slice::FromContainer({1, 2, 3, 4, 5, 6, 7, 8})});
out.push_back(TestArgs{aead,
{0x123456789abcdefull, 123, 321},
Slice::RepeatedChar(1024 * 1024, 'a')});
}
return out;
}();
INSTANTIATE_TEST_CASE_P(AEADCodecTest, AEADCodec,
::testing::ValuesIn(kTestCases.begin(),
kTestCases.end()));
} // namespace aead_codec_test
} // namespace overnet