blob: 94b50988f5ae948f0b8ffed9203852376024d9ea [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/crypto_utils.h"
6
vasilvv872e7a32019-03-12 16:42:44 -07007#include <string>
8
QUICHE teama6ef0a62019-03-07 20:34:33 -05009#include "net/third_party/quiche/src/quic/core/quic_utils.h"
10#include "net/third_party/quiche/src/quic/platform/api/quic_arraysize.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/quic_test_utils.h"
14
15namespace quic {
16namespace test {
17namespace {
18
19class CryptoUtilsTest : public QuicTest {};
20
21TEST_F(CryptoUtilsTest, TestExportKeyingMaterial) {
22 const struct TestVector {
23 // Input (strings of hexadecimal digits):
24 const char* subkey_secret;
25 const char* label;
26 const char* context;
27 size_t result_len;
28
29 // Expected output (string of hexadecimal digits):
30 const char* expected; // Null if it should fail.
31 } test_vector[] = {
32 // Try a typical input
33 {"4823c1189ecc40fce888fbb4cf9ae6254f19ba12e6d9af54788f195a6f509ca3",
34 "e934f78d7a71dd85420fceeb8cea0317",
35 "b8d766b5d3c8aba0009c7ed3de553eba53b4de1030ea91383dcdf724cd8b7217", 32,
36 "a9979da0d5f1c1387d7cbe68f5c4163ddb445a03c4ad6ee72cb49d56726d679e"},
37 // Don't let the label contain nulls
38 {"14fe51e082ffee7d1b4d8d4ab41f8c55", "3132333435363700",
39 "58585858585858585858585858585858", 16, nullptr},
40 // Make sure nulls in the context are fine
41 {"d862c2e36b0a42f7827c67ebc8d44df7", "7a5b95e4e8378123",
42 "4142434445464700", 16, "12d418c6d0738a2e4d85b2d0170f76e1"},
43 // ... and give a different result than without
44 {"d862c2e36b0a42f7827c67ebc8d44df7", "7a5b95e4e8378123", "41424344454647",
45 16, "abfa1c479a6e3ffb98a11dee7d196408"},
46 // Try weird lengths
47 {"d0ec8a34f6cc9a8c96", "49711798cc6251",
48 "933d4a2f30d22f089cfba842791116adc121e0", 23,
49 "c9a46ed0757bd1812f1f21b4d41e62125fec8364a21db7"},
50 };
51
52 for (size_t i = 0; i < QUIC_ARRAYSIZE(test_vector); i++) {
53 // Decode the test vector.
vasilvvc48c8712019-03-11 13:38:16 -070054 std::string subkey_secret =
QUICHE teama6ef0a62019-03-07 20:34:33 -050055 QuicTextUtils::HexDecode(test_vector[i].subkey_secret);
vasilvvc48c8712019-03-11 13:38:16 -070056 std::string label = QuicTextUtils::HexDecode(test_vector[i].label);
57 std::string context = QuicTextUtils::HexDecode(test_vector[i].context);
QUICHE teama6ef0a62019-03-07 20:34:33 -050058 size_t result_len = test_vector[i].result_len;
59 bool expect_ok = test_vector[i].expected != nullptr;
vasilvvc48c8712019-03-11 13:38:16 -070060 std::string expected;
QUICHE teama6ef0a62019-03-07 20:34:33 -050061 if (expect_ok) {
62 expected = QuicTextUtils::HexDecode(test_vector[i].expected);
63 }
64
vasilvvc48c8712019-03-11 13:38:16 -070065 std::string result;
QUICHE teama6ef0a62019-03-07 20:34:33 -050066 bool ok = CryptoUtils::ExportKeyingMaterial(subkey_secret, label, context,
67 result_len, &result);
68 EXPECT_EQ(expect_ok, ok);
69 if (expect_ok) {
70 EXPECT_EQ(result_len, result.length());
71 test::CompareCharArraysWithHexError("HKDF output", result.data(),
72 result.length(), expected.data(),
73 expected.length());
74 }
75 }
76}
77
78TEST_F(CryptoUtilsTest, HandshakeFailureReasonToString) {
79 EXPECT_STREQ("HANDSHAKE_OK",
80 CryptoUtils::HandshakeFailureReasonToString(HANDSHAKE_OK));
81 EXPECT_STREQ("CLIENT_NONCE_UNKNOWN_FAILURE",
82 CryptoUtils::HandshakeFailureReasonToString(
83 CLIENT_NONCE_UNKNOWN_FAILURE));
84 EXPECT_STREQ("CLIENT_NONCE_INVALID_FAILURE",
85 CryptoUtils::HandshakeFailureReasonToString(
86 CLIENT_NONCE_INVALID_FAILURE));
87 EXPECT_STREQ("CLIENT_NONCE_NOT_UNIQUE_FAILURE",
88 CryptoUtils::HandshakeFailureReasonToString(
89 CLIENT_NONCE_NOT_UNIQUE_FAILURE));
90 EXPECT_STREQ("CLIENT_NONCE_INVALID_ORBIT_FAILURE",
91 CryptoUtils::HandshakeFailureReasonToString(
92 CLIENT_NONCE_INVALID_ORBIT_FAILURE));
93 EXPECT_STREQ("CLIENT_NONCE_INVALID_TIME_FAILURE",
94 CryptoUtils::HandshakeFailureReasonToString(
95 CLIENT_NONCE_INVALID_TIME_FAILURE));
96 EXPECT_STREQ("CLIENT_NONCE_STRIKE_REGISTER_TIMEOUT",
97 CryptoUtils::HandshakeFailureReasonToString(
98 CLIENT_NONCE_STRIKE_REGISTER_TIMEOUT));
99 EXPECT_STREQ("CLIENT_NONCE_STRIKE_REGISTER_FAILURE",
100 CryptoUtils::HandshakeFailureReasonToString(
101 CLIENT_NONCE_STRIKE_REGISTER_FAILURE));
102 EXPECT_STREQ("SERVER_NONCE_DECRYPTION_FAILURE",
103 CryptoUtils::HandshakeFailureReasonToString(
104 SERVER_NONCE_DECRYPTION_FAILURE));
105 EXPECT_STREQ("SERVER_NONCE_INVALID_FAILURE",
106 CryptoUtils::HandshakeFailureReasonToString(
107 SERVER_NONCE_INVALID_FAILURE));
108 EXPECT_STREQ("SERVER_NONCE_NOT_UNIQUE_FAILURE",
109 CryptoUtils::HandshakeFailureReasonToString(
110 SERVER_NONCE_NOT_UNIQUE_FAILURE));
111 EXPECT_STREQ("SERVER_NONCE_INVALID_TIME_FAILURE",
112 CryptoUtils::HandshakeFailureReasonToString(
113 SERVER_NONCE_INVALID_TIME_FAILURE));
114 EXPECT_STREQ("SERVER_NONCE_REQUIRED_FAILURE",
115 CryptoUtils::HandshakeFailureReasonToString(
116 SERVER_NONCE_REQUIRED_FAILURE));
117 EXPECT_STREQ("SERVER_CONFIG_INCHOATE_HELLO_FAILURE",
118 CryptoUtils::HandshakeFailureReasonToString(
119 SERVER_CONFIG_INCHOATE_HELLO_FAILURE));
120 EXPECT_STREQ("SERVER_CONFIG_UNKNOWN_CONFIG_FAILURE",
121 CryptoUtils::HandshakeFailureReasonToString(
122 SERVER_CONFIG_UNKNOWN_CONFIG_FAILURE));
123 EXPECT_STREQ("SOURCE_ADDRESS_TOKEN_INVALID_FAILURE",
124 CryptoUtils::HandshakeFailureReasonToString(
125 SOURCE_ADDRESS_TOKEN_INVALID_FAILURE));
126 EXPECT_STREQ("SOURCE_ADDRESS_TOKEN_DECRYPTION_FAILURE",
127 CryptoUtils::HandshakeFailureReasonToString(
128 SOURCE_ADDRESS_TOKEN_DECRYPTION_FAILURE));
129 EXPECT_STREQ("SOURCE_ADDRESS_TOKEN_PARSE_FAILURE",
130 CryptoUtils::HandshakeFailureReasonToString(
131 SOURCE_ADDRESS_TOKEN_PARSE_FAILURE));
132 EXPECT_STREQ("SOURCE_ADDRESS_TOKEN_DIFFERENT_IP_ADDRESS_FAILURE",
133 CryptoUtils::HandshakeFailureReasonToString(
134 SOURCE_ADDRESS_TOKEN_DIFFERENT_IP_ADDRESS_FAILURE));
135 EXPECT_STREQ("SOURCE_ADDRESS_TOKEN_CLOCK_SKEW_FAILURE",
136 CryptoUtils::HandshakeFailureReasonToString(
137 SOURCE_ADDRESS_TOKEN_CLOCK_SKEW_FAILURE));
138 EXPECT_STREQ("SOURCE_ADDRESS_TOKEN_EXPIRED_FAILURE",
139 CryptoUtils::HandshakeFailureReasonToString(
140 SOURCE_ADDRESS_TOKEN_EXPIRED_FAILURE));
141 EXPECT_STREQ("INVALID_EXPECTED_LEAF_CERTIFICATE",
142 CryptoUtils::HandshakeFailureReasonToString(
143 INVALID_EXPECTED_LEAF_CERTIFICATE));
144 EXPECT_STREQ("MAX_FAILURE_REASON",
145 CryptoUtils::HandshakeFailureReasonToString(MAX_FAILURE_REASON));
146 EXPECT_STREQ(
147 "INVALID_HANDSHAKE_FAILURE_REASON",
148 CryptoUtils::HandshakeFailureReasonToString(
149 static_cast<HandshakeFailureReason>(MAX_FAILURE_REASON + 1)));
150}
151
152} // namespace
153} // namespace test
154} // namespace quic