blob: 1341f790d56380aef58177fe15182cd28bbdc342 [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/third_party/quiche/src/quic/core/crypto/cert_compressor.h"
6
7#include <memory>
vasilvv872e7a32019-03-12 16:42:44 -07008#include <string>
QUICHE teama6ef0a62019-03-07 20:34:33 -05009
10#include "net/third_party/quiche/src/quic/core/quic_utils.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050011#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
12#include "net/third_party/quiche/src/quic/platform/api/quic_text_utils.h"
13#include "net/third_party/quiche/src/quic/test_tools/crypto_test_utils.h"
14
15namespace quic {
16namespace test {
17
18class CertCompressorTest : public QuicTest {};
19
20TEST_F(CertCompressorTest, EmptyChain) {
vasilvvc48c8712019-03-11 13:38:16 -070021 std::vector<std::string> chain;
22 const std::string compressed = CertCompressor::CompressChain(
QUICHE teama6ef0a62019-03-07 20:34:33 -050023 chain, QuicStringPiece(), QuicStringPiece(), nullptr);
24 EXPECT_EQ("00", QuicTextUtils::HexEncode(compressed));
25
vasilvvc48c8712019-03-11 13:38:16 -070026 std::vector<std::string> chain2, cached_certs;
QUICHE teama6ef0a62019-03-07 20:34:33 -050027 ASSERT_TRUE(CertCompressor::DecompressChain(compressed, cached_certs, nullptr,
28 &chain2));
29 EXPECT_EQ(chain.size(), chain2.size());
30}
31
32TEST_F(CertCompressorTest, Compressed) {
vasilvvc48c8712019-03-11 13:38:16 -070033 std::vector<std::string> chain;
QUICHE teama6ef0a62019-03-07 20:34:33 -050034 chain.push_back("testcert");
vasilvvc48c8712019-03-11 13:38:16 -070035 const std::string compressed = CertCompressor::CompressChain(
QUICHE teama6ef0a62019-03-07 20:34:33 -050036 chain, QuicStringPiece(), QuicStringPiece(), nullptr);
37 ASSERT_GE(compressed.size(), 2u);
38 EXPECT_EQ("0100", QuicTextUtils::HexEncode(compressed.substr(0, 2)));
39
vasilvvc48c8712019-03-11 13:38:16 -070040 std::vector<std::string> chain2, cached_certs;
QUICHE teama6ef0a62019-03-07 20:34:33 -050041 ASSERT_TRUE(CertCompressor::DecompressChain(compressed, cached_certs, nullptr,
42 &chain2));
43 EXPECT_EQ(chain.size(), chain2.size());
44 EXPECT_EQ(chain[0], chain2[0]);
45}
46
47TEST_F(CertCompressorTest, Common) {
vasilvvc48c8712019-03-11 13:38:16 -070048 std::vector<std::string> chain;
QUICHE teama6ef0a62019-03-07 20:34:33 -050049 chain.push_back("testcert");
50 static const uint64_t set_hash = 42;
51 std::unique_ptr<CommonCertSets> common_sets(
52 crypto_test_utils::MockCommonCertSets(chain[0], set_hash, 1));
vasilvvc48c8712019-03-11 13:38:16 -070053 const std::string compressed = CertCompressor::CompressChain(
QUICHE teama6ef0a62019-03-07 20:34:33 -050054 chain,
55 QuicStringPiece(reinterpret_cast<const char*>(&set_hash),
56 sizeof(set_hash)),
57 QuicStringPiece(), common_sets.get());
58 EXPECT_EQ(
59 "03" /* common */
60 "2a00000000000000" /* set hash 42 */
61 "01000000" /* index 1 */
62 "00" /* end of list */,
63 QuicTextUtils::HexEncode(compressed));
64
vasilvvc48c8712019-03-11 13:38:16 -070065 std::vector<std::string> chain2, cached_certs;
QUICHE teama6ef0a62019-03-07 20:34:33 -050066 ASSERT_TRUE(CertCompressor::DecompressChain(compressed, cached_certs,
67 common_sets.get(), &chain2));
68 EXPECT_EQ(chain.size(), chain2.size());
69 EXPECT_EQ(chain[0], chain2[0]);
70}
71
72TEST_F(CertCompressorTest, Cached) {
vasilvvc48c8712019-03-11 13:38:16 -070073 std::vector<std::string> chain;
QUICHE teama6ef0a62019-03-07 20:34:33 -050074 chain.push_back("testcert");
75 uint64_t hash = QuicUtils::FNV1a_64_Hash(chain[0]);
76 QuicStringPiece hash_bytes(reinterpret_cast<char*>(&hash), sizeof(hash));
vasilvvc48c8712019-03-11 13:38:16 -070077 const std::string compressed = CertCompressor::CompressChain(
QUICHE teama6ef0a62019-03-07 20:34:33 -050078 chain, QuicStringPiece(), hash_bytes, nullptr);
79
80 EXPECT_EQ("02" /* cached */ + QuicTextUtils::HexEncode(hash_bytes) +
81 "00" /* end of list */,
82 QuicTextUtils::HexEncode(compressed));
83
vasilvvc48c8712019-03-11 13:38:16 -070084 std::vector<std::string> cached_certs, chain2;
QUICHE teama6ef0a62019-03-07 20:34:33 -050085 cached_certs.push_back(chain[0]);
86 ASSERT_TRUE(CertCompressor::DecompressChain(compressed, cached_certs, nullptr,
87 &chain2));
88 EXPECT_EQ(chain.size(), chain2.size());
89 EXPECT_EQ(chain[0], chain2[0]);
90}
91
92TEST_F(CertCompressorTest, BadInputs) {
vasilvvc48c8712019-03-11 13:38:16 -070093 std::vector<std::string> cached_certs, chain;
QUICHE teama6ef0a62019-03-07 20:34:33 -050094
95 EXPECT_FALSE(CertCompressor::DecompressChain(
96 QuicTextUtils::HexEncode("04") /* bad entry type */, cached_certs,
97 nullptr, &chain));
98
99 EXPECT_FALSE(CertCompressor::DecompressChain(
100 QuicTextUtils::HexEncode("01") /* no terminator */, cached_certs, nullptr,
101 &chain));
102
103 EXPECT_FALSE(CertCompressor::DecompressChain(
104 QuicTextUtils::HexEncode("0200") /* hash truncated */, cached_certs,
105 nullptr, &chain));
106
107 EXPECT_FALSE(CertCompressor::DecompressChain(
108 QuicTextUtils::HexEncode("0300") /* hash and index truncated */,
109 cached_certs, nullptr, &chain));
110
111 /* without a CommonCertSets */
112 EXPECT_FALSE(CertCompressor::DecompressChain(
113 QuicTextUtils::HexEncode("03"
114 "0000000000000000"
115 "00000000"),
116 cached_certs, nullptr, &chain));
117
118 std::unique_ptr<CommonCertSets> common_sets(
119 crypto_test_utils::MockCommonCertSets("foo", 42, 1));
120
121 /* incorrect hash and index */
122 EXPECT_FALSE(CertCompressor::DecompressChain(
123 QuicTextUtils::HexEncode("03"
124 "a200000000000000"
125 "00000000"),
126 cached_certs, nullptr, &chain));
127}
128
129} // namespace test
130} // namespace quic