OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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 #ifndef NET_QUIC_CORE_CRYPTO_QUIC_CRYPTO_CLIENT_CONFIG_H_ | 5 #ifndef NET_QUIC_CORE_CRYPTO_QUIC_CRYPTO_CLIENT_CONFIG_H_ |
6 #define NET_QUIC_CORE_CRYPTO_QUIC_CRYPTO_CLIENT_CONFIG_H_ | 6 #define NET_QUIC_CORE_CRYPTO_QUIC_CRYPTO_CLIENT_CONFIG_H_ |
7 | 7 |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <map> | 10 #include <map> |
11 #include <memory> | 11 #include <memory> |
12 #include <queue> | 12 #include <queue> |
13 #include <string> | 13 #include <string> |
14 #include <vector> | 14 #include <vector> |
15 | 15 |
16 #include "base/macros.h" | 16 #include "base/macros.h" |
17 #include "base/strings/string_piece.h" | 17 #include "base/strings/string_piece.h" |
18 #include "net/quic/core/crypto/crypto_handshake.h" | 18 #include "net/quic/core/crypto/crypto_handshake.h" |
19 #include "net/quic/core/quic_packets.h" | 19 #include "net/quic/core/quic_packets.h" |
20 #include "net/quic/core/quic_server_id.h" | 20 #include "net/quic/core/quic_server_id.h" |
21 #include "net/quic/platform/api/quic_export.h" | 21 #include "net/quic/platform/api/quic_export.h" |
| 22 #include "net/quic/platform/api/quic_reference_counted.h" |
22 | 23 |
23 namespace net { | 24 namespace net { |
24 | 25 |
25 class ChannelIDKey; | 26 class ChannelIDKey; |
26 class ChannelIDSource; | 27 class ChannelIDSource; |
27 class CryptoHandshakeMessage; | 28 class CryptoHandshakeMessage; |
28 class ProofVerifier; | 29 class ProofVerifier; |
29 class ProofVerifyDetails; | 30 class ProofVerifyDetails; |
30 class QuicRandom; | 31 class QuicRandom; |
31 | 32 |
(...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
225 // QUIC protocol that this client chose to use initially. This allows the | 226 // QUIC protocol that this client chose to use initially. This allows the |
226 // server to detect downgrade attacks. If |demand_x509_proof| is true, | 227 // server to detect downgrade attacks. If |demand_x509_proof| is true, |
227 // then |out| will include an X509 proof demand, and the associated | 228 // then |out| will include an X509 proof demand, and the associated |
228 // certificate related fields. | 229 // certificate related fields. |
229 void FillInchoateClientHello( | 230 void FillInchoateClientHello( |
230 const QuicServerId& server_id, | 231 const QuicServerId& server_id, |
231 const QuicVersion preferred_version, | 232 const QuicVersion preferred_version, |
232 const CachedState* cached, | 233 const CachedState* cached, |
233 QuicRandom* rand, | 234 QuicRandom* rand, |
234 bool demand_x509_proof, | 235 bool demand_x509_proof, |
235 scoped_refptr<QuicCryptoNegotiatedParameters> out_params, | 236 QuicReferenceCountedPointer<QuicCryptoNegotiatedParameters> out_params, |
236 CryptoHandshakeMessage* out) const; | 237 CryptoHandshakeMessage* out) const; |
237 | 238 |
238 // FillClientHello sets |out| to be a CHLO message based on the configuration | 239 // FillClientHello sets |out| to be a CHLO message based on the configuration |
239 // of this object. This object must have cached enough information about | 240 // of this object. This object must have cached enough information about |
240 // the server's hostname in order to perform a handshake. This can be checked | 241 // the server's hostname in order to perform a handshake. This can be checked |
241 // with the |IsComplete| member of |CachedState|. | 242 // with the |IsComplete| member of |CachedState|. |
242 // | 243 // |
243 // |now| and |rand| are used to generate the nonce and |out_params| is | 244 // |now| and |rand| are used to generate the nonce and |out_params| is |
244 // filled with the results of the handshake that the server is expected to | 245 // filled with the results of the handshake that the server is expected to |
245 // accept. |preferred_version| is the version of the QUIC protocol that this | 246 // accept. |preferred_version| is the version of the QUIC protocol that this |
246 // client chose to use initially. This allows the server to detect downgrade | 247 // client chose to use initially. This allows the server to detect downgrade |
247 // attacks. | 248 // attacks. |
248 // | 249 // |
249 // If |channel_id_key| is not null, it is used to sign a secret value derived | 250 // If |channel_id_key| is not null, it is used to sign a secret value derived |
250 // from the client and server's keys, and the Channel ID public key and the | 251 // from the client and server's keys, and the Channel ID public key and the |
251 // signature are placed in the CETV value of the CHLO. | 252 // signature are placed in the CETV value of the CHLO. |
252 QuicErrorCode FillClientHello( | 253 QuicErrorCode FillClientHello( |
253 const QuicServerId& server_id, | 254 const QuicServerId& server_id, |
254 QuicConnectionId connection_id, | 255 QuicConnectionId connection_id, |
255 const QuicVersion preferred_version, | 256 const QuicVersion preferred_version, |
256 const CachedState* cached, | 257 const CachedState* cached, |
257 QuicWallTime now, | 258 QuicWallTime now, |
258 QuicRandom* rand, | 259 QuicRandom* rand, |
259 const ChannelIDKey* channel_id_key, | 260 const ChannelIDKey* channel_id_key, |
260 scoped_refptr<QuicCryptoNegotiatedParameters> out_params, | 261 QuicReferenceCountedPointer<QuicCryptoNegotiatedParameters> out_params, |
261 CryptoHandshakeMessage* out, | 262 CryptoHandshakeMessage* out, |
262 std::string* error_details) const; | 263 std::string* error_details) const; |
263 | 264 |
264 // ProcessRejection processes a REJ message from a server and updates the | 265 // ProcessRejection processes a REJ message from a server and updates the |
265 // cached information about that server. After this, |IsComplete| may return | 266 // cached information about that server. After this, |IsComplete| may return |
266 // true for that server's CachedState. If the rejection message contains state | 267 // true for that server's CachedState. If the rejection message contains state |
267 // about a future handshake (i.e. an nonce value from the server), then it | 268 // about a future handshake (i.e. an nonce value from the server), then it |
268 // will be saved in |out_params|. |now| is used to judge whether the server | 269 // will be saved in |out_params|. |now| is used to judge whether the server |
269 // config in the rejection message has expired. | 270 // config in the rejection message has expired. |
270 QuicErrorCode ProcessRejection( | 271 QuicErrorCode ProcessRejection( |
271 const CryptoHandshakeMessage& rej, | 272 const CryptoHandshakeMessage& rej, |
272 QuicWallTime now, | 273 QuicWallTime now, |
273 QuicVersion version, | 274 QuicVersion version, |
274 base::StringPiece chlo_hash, | 275 base::StringPiece chlo_hash, |
275 CachedState* cached, | 276 CachedState* cached, |
276 scoped_refptr<QuicCryptoNegotiatedParameters> out_params, | 277 QuicReferenceCountedPointer<QuicCryptoNegotiatedParameters> out_params, |
277 std::string* error_details); | 278 std::string* error_details); |
278 | 279 |
279 // ProcessServerHello processes the message in |server_hello|, updates the | 280 // ProcessServerHello processes the message in |server_hello|, updates the |
280 // cached information about that server, writes the negotiated parameters to | 281 // cached information about that server, writes the negotiated parameters to |
281 // |out_params| and returns QUIC_NO_ERROR. If |server_hello| is unacceptable | 282 // |out_params| and returns QUIC_NO_ERROR. If |server_hello| is unacceptable |
282 // then it puts an error message in |error_details| and returns an error | 283 // then it puts an error message in |error_details| and returns an error |
283 // code. |version| is the QUIC version for the current connection. | 284 // code. |version| is the QUIC version for the current connection. |
284 // |negotiated_versions| contains the list of version, if any, that were | 285 // |negotiated_versions| contains the list of version, if any, that were |
285 // present in a version negotiation packet previously recevied from the | 286 // present in a version negotiation packet previously recevied from the |
286 // server. The contents of this list will be compared against the list of | 287 // server. The contents of this list will be compared against the list of |
287 // versions provided in the VER tag of the server hello. | 288 // versions provided in the VER tag of the server hello. |
288 QuicErrorCode ProcessServerHello( | 289 QuicErrorCode ProcessServerHello( |
289 const CryptoHandshakeMessage& server_hello, | 290 const CryptoHandshakeMessage& server_hello, |
290 QuicConnectionId connection_id, | 291 QuicConnectionId connection_id, |
291 QuicVersion version, | 292 QuicVersion version, |
292 const QuicVersionVector& negotiated_versions, | 293 const QuicVersionVector& negotiated_versions, |
293 CachedState* cached, | 294 CachedState* cached, |
294 scoped_refptr<QuicCryptoNegotiatedParameters> out_params, | 295 QuicReferenceCountedPointer<QuicCryptoNegotiatedParameters> out_params, |
295 std::string* error_details); | 296 std::string* error_details); |
296 | 297 |
297 // Processes the message in |server_update|, updating the cached source | 298 // Processes the message in |server_update|, updating the cached source |
298 // address token, and server config. | 299 // address token, and server config. |
299 // If |server_update| is invalid then |error_details| will contain an error | 300 // If |server_update| is invalid then |error_details| will contain an error |
300 // message, and an error code will be returned. If all has gone well | 301 // message, and an error code will be returned. If all has gone well |
301 // QUIC_NO_ERROR is returned. | 302 // QUIC_NO_ERROR is returned. |
302 QuicErrorCode ProcessServerConfigUpdate( | 303 QuicErrorCode ProcessServerConfigUpdate( |
303 const CryptoHandshakeMessage& server_update, | 304 const CryptoHandshakeMessage& server_update, |
304 QuicWallTime now, | 305 QuicWallTime now, |
305 const QuicVersion version, | 306 const QuicVersion version, |
306 base::StringPiece chlo_hash, | 307 base::StringPiece chlo_hash, |
307 CachedState* cached, | 308 CachedState* cached, |
308 scoped_refptr<QuicCryptoNegotiatedParameters> out_params, | 309 QuicReferenceCountedPointer<QuicCryptoNegotiatedParameters> out_params, |
309 std::string* error_details); | 310 std::string* error_details); |
310 | 311 |
311 ProofVerifier* proof_verifier() const; | 312 ProofVerifier* proof_verifier() const; |
312 | 313 |
313 ChannelIDSource* channel_id_source() const; | 314 ChannelIDSource* channel_id_source() const; |
314 | 315 |
315 // SetChannelIDSource sets a ChannelIDSource that will be called, when the | 316 // SetChannelIDSource sets a ChannelIDSource that will be called, when the |
316 // server supports channel IDs, to obtain a channel ID for signing a message | 317 // server supports channel IDs, to obtain a channel ID for signing a message |
317 // proving possession of the channel ID. This object takes ownership of | 318 // proving possession of the channel ID. This object takes ownership of |
318 // |source|. | 319 // |source|. |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
384 | 385 |
385 // The |user_agent_id_| passed in QUIC's CHLO message. | 386 // The |user_agent_id_| passed in QUIC's CHLO message. |
386 std::string user_agent_id_; | 387 std::string user_agent_id_; |
387 | 388 |
388 DISALLOW_COPY_AND_ASSIGN(QuicCryptoClientConfig); | 389 DISALLOW_COPY_AND_ASSIGN(QuicCryptoClientConfig); |
389 }; | 390 }; |
390 | 391 |
391 } // namespace net | 392 } // namespace net |
392 | 393 |
393 #endif // NET_QUIC_CORE_CRYPTO_QUIC_CRYPTO_CLIENT_CONFIG_H_ | 394 #endif // NET_QUIC_CORE_CRYPTO_QUIC_CRYPTO_CLIENT_CONFIG_H_ |
OLD | NEW |