OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/quic/quic_crypto_server_stream.h" | 5 #include "net/quic/quic_crypto_server_stream.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/memory/scoped_ptr.h" | 10 #include "base/memory/scoped_ptr.h" |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 DISALLOW_COPY_AND_ASSIGN(TestQuicVisitor); | 54 DISALLOW_COPY_AND_ASSIGN(TestQuicVisitor); |
55 }; | 55 }; |
56 | 56 |
57 class QuicCryptoServerStreamTest : public ::testing::Test { | 57 class QuicCryptoServerStreamTest : public ::testing::Test { |
58 public: | 58 public: |
59 QuicCryptoServerStreamTest() | 59 QuicCryptoServerStreamTest() |
60 : guid_(1), | 60 : guid_(1), |
61 addr_(ParseIPLiteralToNumber("192.0.2.33", &ip_) ? | 61 addr_(ParseIPLiteralToNumber("192.0.2.33", &ip_) ? |
62 ip_ : IPAddressNumber(), 1), | 62 ip_ : IPAddressNumber(), 1), |
63 connection_(new PacketSavingConnection(guid_, addr_, true)), | 63 connection_(new PacketSavingConnection(guid_, addr_, true)), |
64 session_(connection_, true), | 64 session_(connection_, QuicConfig(), true), |
65 crypto_config_(QuicCryptoServerConfig::TESTING), | 65 crypto_config_(QuicCryptoServerConfig::TESTING), |
66 stream_(config_, crypto_config_, &session_) { | 66 stream_(crypto_config_, &session_) { |
| 67 session_.config()->SetDefaults(); |
67 session_.SetCryptoStream(&stream_); | 68 session_.SetCryptoStream(&stream_); |
68 // We advance the clock initially because the default time is zero and the | 69 // We advance the clock initially because the default time is zero and the |
69 // strike register worries that we've just overflowed a uint32 time. | 70 // strike register worries that we've just overflowed a uint32 time. |
70 connection_->AdvanceTime(QuicTime::Delta::FromSeconds(100000)); | 71 connection_->AdvanceTime(QuicTime::Delta::FromSeconds(100000)); |
71 // TODO(rtenneti): Enable testing of ProofSource. | 72 // TODO(rtenneti): Enable testing of ProofSource. |
72 // crypto_config_.SetProofSource(CryptoTestUtils::ProofSourceForTesting()); | 73 // crypto_config_.SetProofSource(CryptoTestUtils::ProofSourceForTesting()); |
73 | 74 |
74 CryptoTestUtils::SetupCryptoServerConfigForTest( | 75 CryptoTestUtils::SetupCryptoServerConfigForTest( |
75 connection_->clock(), connection_->random_generator(), &config_, | 76 connection_->clock(), connection_->random_generator(), |
76 &crypto_config_); | 77 session_.config(), &crypto_config_); |
77 } | 78 } |
78 | 79 |
79 void ConstructHandshakeMessage() { | 80 void ConstructHandshakeMessage() { |
80 CryptoFramer framer; | 81 CryptoFramer framer; |
81 message_data_.reset(framer.ConstructHandshakeMessage(message_)); | 82 message_data_.reset(framer.ConstructHandshakeMessage(message_)); |
82 } | 83 } |
83 | 84 |
84 int CompleteCryptoHandshake() { | 85 int CompleteCryptoHandshake() { |
85 return CryptoTestUtils::HandshakeWithFakeClient(connection_, &stream_); | 86 return CryptoTestUtils::HandshakeWithFakeClient(connection_, &stream_, |
| 87 client_options_); |
86 } | 88 } |
87 | 89 |
88 protected: | 90 protected: |
89 IPAddressNumber ip_; | 91 IPAddressNumber ip_; |
90 QuicGuid guid_; | 92 QuicGuid guid_; |
91 IPEndPoint addr_; | 93 IPEndPoint addr_; |
92 PacketSavingConnection* connection_; | 94 PacketSavingConnection* connection_; |
93 TestSession session_; | 95 TestSession session_; |
94 QuicConfig config_; | 96 QuicConfig config_; |
95 QuicCryptoServerConfig crypto_config_; | 97 QuicCryptoServerConfig crypto_config_; |
96 QuicCryptoServerStream stream_; | 98 QuicCryptoServerStream stream_; |
97 CryptoHandshakeMessage message_; | 99 CryptoHandshakeMessage message_; |
98 scoped_ptr<QuicData> message_data_; | 100 scoped_ptr<QuicData> message_data_; |
| 101 CryptoTestUtils::FakeClientOptions client_options_; |
99 }; | 102 }; |
100 | 103 |
101 TEST_F(QuicCryptoServerStreamTest, NotInitiallyConected) { | 104 TEST_F(QuicCryptoServerStreamTest, NotInitiallyConected) { |
102 if (!Aes128GcmEncrypter::IsSupported()) { | 105 if (!Aes128GcmEncrypter::IsSupported()) { |
103 LOG(INFO) << "AES GCM not supported. Test skipped."; | 106 LOG(INFO) << "AES GCM not supported. Test skipped."; |
104 return; | 107 return; |
105 } | 108 } |
106 | 109 |
107 EXPECT_FALSE(stream_.encryption_established()); | 110 EXPECT_FALSE(stream_.encryption_established()); |
108 EXPECT_FALSE(stream_.handshake_confirmed()); | 111 EXPECT_FALSE(stream_.handshake_confirmed()); |
(...skipping 28 matching lines...) Expand all Loading... |
137 IPAddressNumber ip; | 140 IPAddressNumber ip; |
138 ParseIPLiteralToNumber("127.0.0.1", &ip); | 141 ParseIPLiteralToNumber("127.0.0.1", &ip); |
139 IPEndPoint addr(ip, 0); | 142 IPEndPoint addr(ip, 0); |
140 PacketSavingConnection* client_conn = | 143 PacketSavingConnection* client_conn = |
141 new PacketSavingConnection(guid, addr, false); | 144 new PacketSavingConnection(guid, addr, false); |
142 PacketSavingConnection* server_conn = | 145 PacketSavingConnection* server_conn = |
143 new PacketSavingConnection(guid, addr, false); | 146 new PacketSavingConnection(guid, addr, false); |
144 client_conn->AdvanceTime(QuicTime::Delta::FromSeconds(100000)); | 147 client_conn->AdvanceTime(QuicTime::Delta::FromSeconds(100000)); |
145 server_conn->AdvanceTime(QuicTime::Delta::FromSeconds(100000)); | 148 server_conn->AdvanceTime(QuicTime::Delta::FromSeconds(100000)); |
146 | 149 |
147 scoped_ptr<TestSession> client_session(new TestSession(client_conn, true)); | |
148 scoped_ptr<TestSession> server_session(new TestSession(server_conn, true)); | |
149 | |
150 QuicConfig client_config; | 150 QuicConfig client_config; |
| 151 scoped_ptr<TestSession> client_session( |
| 152 new TestSession(client_conn, client_config, false)); |
| 153 client_session->config()->SetDefaults(); |
151 QuicCryptoClientConfig client_crypto_config; | 154 QuicCryptoClientConfig client_crypto_config; |
152 | |
153 client_config.SetDefaults(); | |
154 client_crypto_config.SetDefaults(); | 155 client_crypto_config.SetDefaults(); |
155 | 156 |
156 scoped_ptr<QuicCryptoClientStream> client(new QuicCryptoClientStream( | 157 scoped_ptr<QuicCryptoClientStream> client(new QuicCryptoClientStream( |
157 "test.example.com", client_config, client_session.get(), | 158 "test.example.com", client_session.get(), &client_crypto_config)); |
158 &client_crypto_config)); | |
159 client_session->SetCryptoStream(client.get()); | 159 client_session->SetCryptoStream(client.get()); |
160 | 160 |
161 // Do a first handshake in order to prime the client config with the server's | 161 // Do a first handshake in order to prime the client config with the server's |
162 // information. | 162 // information. |
163 CHECK(client->CryptoConnect()); | 163 CHECK(client->CryptoConnect()); |
164 CHECK_EQ(1u, client_conn->packets_.size()); | 164 CHECK_EQ(1u, client_conn->packets_.size()); |
165 | 165 |
| 166 scoped_ptr<TestSession> server_session( |
| 167 new TestSession(server_conn, config_, true)); |
| 168 server_session->config()->SetDefaults(); |
166 scoped_ptr<QuicCryptoServerStream> server( | 169 scoped_ptr<QuicCryptoServerStream> server( |
167 new QuicCryptoServerStream(config_, crypto_config_, | 170 new QuicCryptoServerStream(crypto_config_, server_session.get())); |
168 server_session.get())); | |
169 server_session->SetCryptoStream(server.get()); | 171 server_session->SetCryptoStream(server.get()); |
170 | 172 |
171 CryptoTestUtils::CommunicateHandshakeMessages( | 173 CryptoTestUtils::CommunicateHandshakeMessages( |
172 client_conn, client.get(), server_conn, server.get()); | 174 client_conn, client.get(), server_conn, server.get()); |
173 EXPECT_EQ(2, client->num_sent_client_hellos()); | 175 EXPECT_EQ(2, client->num_sent_client_hellos()); |
174 | 176 |
175 // Now do another handshake, hopefully in 0-RTT. | 177 // Now do another handshake, hopefully in 0-RTT. |
176 LOG(INFO) << "Resetting for 0-RTT handshake attempt"; | 178 LOG(INFO) << "Resetting for 0-RTT handshake attempt"; |
177 | 179 |
178 client_conn = new PacketSavingConnection(guid, addr, false); | 180 client_conn = new PacketSavingConnection(guid, addr, false); |
179 server_conn = new PacketSavingConnection(guid, addr, false); | 181 server_conn = new PacketSavingConnection(guid, addr, false); |
180 // We need to advance time past the strike-server window so that it's | 182 // We need to advance time past the strike-server window so that it's |
181 // authoritative in this time span. | 183 // authoritative in this time span. |
182 client_conn->AdvanceTime(QuicTime::Delta::FromSeconds(102000)); | 184 client_conn->AdvanceTime(QuicTime::Delta::FromSeconds(102000)); |
183 server_conn->AdvanceTime(QuicTime::Delta::FromSeconds(102000)); | 185 server_conn->AdvanceTime(QuicTime::Delta::FromSeconds(102000)); |
184 | 186 |
185 // This causes the client's nonce to be different and thus stops the | 187 // This causes the client's nonce to be different and thus stops the |
186 // strike-register from rejecting the repeated nonce. | 188 // strike-register from rejecting the repeated nonce. |
187 client_conn->random_generator()->Reseed(NULL, 0); | 189 client_conn->random_generator()->Reseed(NULL, 0); |
188 client_session.reset(new TestSession(client_conn, true)); | 190 client_session.reset(new TestSession(client_conn, client_config, false)); |
189 server_session.reset(new TestSession(server_conn, true)); | 191 client_session->config()->SetDefaults(); |
| 192 server_session.reset(new TestSession(server_conn, config_, true)); |
| 193 server_session->config()->SetDefaults(); |
190 client.reset(new QuicCryptoClientStream( | 194 client.reset(new QuicCryptoClientStream( |
191 "test.example.com", client_config, client_session.get(), | 195 "test.example.com", client_session.get(), &client_crypto_config)); |
192 &client_crypto_config)); | |
193 client_session->SetCryptoStream(client.get()); | 196 client_session->SetCryptoStream(client.get()); |
194 | 197 |
195 server.reset(new QuicCryptoServerStream(config_, crypto_config_, | 198 server.reset(new QuicCryptoServerStream(crypto_config_, |
196 server_session.get())); | 199 server_session.get())); |
197 server_session->SetCryptoStream(server.get()); | 200 server_session->SetCryptoStream(server.get()); |
198 | 201 |
199 CHECK(client->CryptoConnect()); | 202 CHECK(client->CryptoConnect()); |
200 | 203 |
201 CryptoTestUtils::CommunicateHandshakeMessages( | 204 CryptoTestUtils::CommunicateHandshakeMessages( |
202 client_conn, client.get(), server_conn, server.get()); | 205 client_conn, client.get(), server_conn, server.get()); |
203 EXPECT_EQ(1, client->num_sent_client_hellos()); | 206 EXPECT_EQ(1, client->num_sent_client_hellos()); |
204 } | 207 } |
205 | 208 |
(...skipping 17 matching lines...) Expand all Loading... |
223 return; | 226 return; |
224 } | 227 } |
225 | 228 |
226 message_.set_tag(kSHLO); | 229 message_.set_tag(kSHLO); |
227 ConstructHandshakeMessage(); | 230 ConstructHandshakeMessage(); |
228 EXPECT_CALL(*connection_, SendConnectionClose( | 231 EXPECT_CALL(*connection_, SendConnectionClose( |
229 QUIC_INVALID_CRYPTO_MESSAGE_TYPE)); | 232 QUIC_INVALID_CRYPTO_MESSAGE_TYPE)); |
230 stream_.ProcessData(message_data_->data(), message_data_->length()); | 233 stream_.ProcessData(message_data_->data(), message_data_->length()); |
231 } | 234 } |
232 | 235 |
| 236 TEST_F(QuicCryptoServerStreamTest, WithoutCertificates) { |
| 237 if (!Aes128GcmEncrypter::IsSupported()) { |
| 238 LOG(INFO) << "AES GCM not supported. Test skipped."; |
| 239 return; |
| 240 } |
| 241 |
| 242 crypto_config_.SetProofSource(NULL); |
| 243 client_options_.dont_verify_certs = true; |
| 244 |
| 245 // Only 2 client hellos need to be sent in the no-certs case: one to get the |
| 246 // source-address token and the second to finish. |
| 247 EXPECT_EQ(2, CompleteCryptoHandshake()); |
| 248 EXPECT_TRUE(stream_.encryption_established()); |
| 249 EXPECT_TRUE(stream_.handshake_confirmed()); |
| 250 } |
| 251 |
233 } // namespace | 252 } // namespace |
234 } // namespace test | 253 } // namespace test |
235 } // namespace net | 254 } // namespace net |
OLD | NEW |