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 #include "net/quic/crypto/quic_crypto_server_config.h" | 5 #include "net/quic/crypto/quic_crypto_server_config.h" |
6 | 6 |
7 #include <stdlib.h> | 7 #include <stdlib.h> |
8 #include <algorithm> | 8 #include <algorithm> |
9 | 9 |
10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
(...skipping 529 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
540 QuicCryptoNegotiatedParameters* params, | 540 QuicCryptoNegotiatedParameters* params, |
541 QuicCryptoProof* crypto_proof, | 541 QuicCryptoProof* crypto_proof, |
542 CryptoHandshakeMessage* out, | 542 CryptoHandshakeMessage* out, |
543 string* error_details) const { | 543 string* error_details) const { |
544 DCHECK(error_details); | 544 DCHECK(error_details); |
545 | 545 |
546 const CryptoHandshakeMessage& client_hello = | 546 const CryptoHandshakeMessage& client_hello = |
547 validate_chlo_result.client_hello; | 547 validate_chlo_result.client_hello; |
548 const ClientHelloInfo& info = validate_chlo_result.info; | 548 const ClientHelloInfo& info = validate_chlo_result.info; |
549 | 549 |
550 // If the client's preferred version is not the version we are currently | 550 QuicErrorCode valid = CryptoUtils::ValidateClientHello( |
551 // speaking, then the client went through a version negotiation. In this | 551 client_hello, version, supported_versions, error_details); |
552 // case, we need to make sure that we actually do not support this version | 552 if (valid != QUIC_NO_ERROR) |
553 // and that it wasn't a downgrade attack. | 553 return valid; |
554 QuicTag client_version_tag; | |
555 if (client_hello.GetUint32(kVER, &client_version_tag) != QUIC_NO_ERROR) { | |
556 *error_details = "client hello missing version list"; | |
557 return QUIC_INVALID_CRYPTO_MESSAGE_PARAMETER; | |
558 } | |
559 QuicVersion client_version = QuicTagToQuicVersion(client_version_tag); | |
560 if (client_version != version) { | |
561 // Just because client_version is a valid version enum doesn't mean that | |
562 // this server actually supports that version, so we check to see if | |
563 // it's actually in the supported versions list. | |
564 for (size_t i = 0; i < supported_versions.size(); ++i) { | |
565 if (client_version == supported_versions[i]) { | |
566 *error_details = "Downgrade attack detected"; | |
567 return QUIC_VERSION_NEGOTIATION_MISMATCH; | |
568 } | |
569 } | |
570 } | |
571 | 554 |
572 StringPiece requested_scid; | 555 StringPiece requested_scid; |
573 client_hello.GetStringPiece(kSCID, &requested_scid); | 556 client_hello.GetStringPiece(kSCID, &requested_scid); |
574 const QuicWallTime now(clock->WallNow()); | 557 const QuicWallTime now(clock->WallNow()); |
575 | 558 |
576 scoped_refptr<Config> requested_config; | 559 scoped_refptr<Config> requested_config; |
577 scoped_refptr<Config> primary_config; | 560 scoped_refptr<Config> primary_config; |
578 { | 561 { |
579 base::AutoLock locked(configs_lock_); | 562 base::AutoLock locked(configs_lock_); |
580 | 563 |
(...skipping 1160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1741 QuicCryptoServerConfig::Config::Config() | 1724 QuicCryptoServerConfig::Config::Config() |
1742 : channel_id_enabled(false), | 1725 : channel_id_enabled(false), |
1743 is_primary(false), | 1726 is_primary(false), |
1744 primary_time(QuicWallTime::Zero()), | 1727 primary_time(QuicWallTime::Zero()), |
1745 priority(0), | 1728 priority(0), |
1746 source_address_token_boxer(nullptr) {} | 1729 source_address_token_boxer(nullptr) {} |
1747 | 1730 |
1748 QuicCryptoServerConfig::Config::~Config() { STLDeleteElements(&key_exchanges); } | 1731 QuicCryptoServerConfig::Config::~Config() { STLDeleteElements(&key_exchanges); } |
1749 | 1732 |
1750 } // namespace net | 1733 } // namespace net |
OLD | NEW |