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_client_config.h" | 5 #include "net/quic/crypto/quic_crypto_client_config.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "base/metrics/histogram_macros.h" | 9 #include "base/metrics/histogram_macros.h" |
10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
(...skipping 469 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
480 ++i) { | 480 ++i) { |
481 hashes.push_back(QuicUtils::FNV1a_64_Hash(i->data(), i->size())); | 481 hashes.push_back(QuicUtils::FNV1a_64_Hash(i->data(), i->size())); |
482 } | 482 } |
483 out->SetVector(kCCRT, hashes); | 483 out->SetVector(kCCRT, hashes); |
484 } | 484 } |
485 } | 485 } |
486 | 486 |
487 QuicErrorCode QuicCryptoClientConfig::FillClientHello( | 487 QuicErrorCode QuicCryptoClientConfig::FillClientHello( |
488 const QuicServerId& server_id, | 488 const QuicServerId& server_id, |
489 QuicConnectionId connection_id, | 489 QuicConnectionId connection_id, |
| 490 const QuicVersion actual_version, |
490 const QuicVersion preferred_version, | 491 const QuicVersion preferred_version, |
491 const CachedState* cached, | 492 const CachedState* cached, |
492 QuicWallTime now, | 493 QuicWallTime now, |
493 QuicRandom* rand, | 494 QuicRandom* rand, |
494 const ChannelIDKey* channel_id_key, | 495 const ChannelIDKey* channel_id_key, |
495 QuicCryptoNegotiatedParameters* out_params, | 496 QuicCryptoNegotiatedParameters* out_params, |
496 CryptoHandshakeMessage* out, | 497 CryptoHandshakeMessage* out, |
497 string* error_details) const { | 498 string* error_details) const { |
498 DCHECK(error_details != nullptr); | 499 DCHECK(error_details != nullptr); |
499 | 500 |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
646 return QUIC_INVALID_CHANNEL_ID_SIGNATURE; | 647 return QUIC_INVALID_CHANNEL_ID_SIGNATURE; |
647 } | 648 } |
648 | 649 |
649 cetv.SetStringPiece(kCIDK, key); | 650 cetv.SetStringPiece(kCIDK, key); |
650 cetv.SetStringPiece(kCIDS, signature); | 651 cetv.SetStringPiece(kCIDS, signature); |
651 | 652 |
652 CrypterPair crypters; | 653 CrypterPair crypters; |
653 if (!CryptoUtils::DeriveKeys( | 654 if (!CryptoUtils::DeriveKeys( |
654 out_params->initial_premaster_secret, out_params->aead, | 655 out_params->initial_premaster_secret, out_params->aead, |
655 out_params->client_nonce, out_params->server_nonce, hkdf_input, | 656 out_params->client_nonce, out_params->server_nonce, hkdf_input, |
656 Perspective::IS_CLIENT, &crypters, nullptr /* subkey secret */)) { | 657 Perspective::IS_CLIENT, CryptoUtils::Diversification::Never(), |
| 658 &crypters, nullptr /* subkey secret */)) { |
657 *error_details = "Symmetric key setup failed"; | 659 *error_details = "Symmetric key setup failed"; |
658 return QUIC_CRYPTO_SYMMETRIC_KEY_SETUP_FAILED; | 660 return QUIC_CRYPTO_SYMMETRIC_KEY_SETUP_FAILED; |
659 } | 661 } |
660 | 662 |
661 const QuicData& cetv_plaintext = cetv.GetSerialized(); | 663 const QuicData& cetv_plaintext = cetv.GetSerialized(); |
662 const size_t encrypted_len = | 664 const size_t encrypted_len = |
663 crypters.encrypter->GetCiphertextSize(cetv_plaintext.length()); | 665 crypters.encrypter->GetCiphertextSize(cetv_plaintext.length()); |
664 std::unique_ptr<char[]> output(new char[encrypted_len]); | 666 std::unique_ptr<char[]> output(new char[encrypted_len]); |
665 size_t output_size = 0; | 667 size_t output_size = 0; |
666 if (!crypters.encrypter->EncryptPacket( | 668 if (!crypters.encrypter->EncryptPacket( |
(...skipping 29 matching lines...) Expand all Loading... |
696 out_params->hkdf_input_suffix.append(certs[0]); | 698 out_params->hkdf_input_suffix.append(certs[0]); |
697 } | 699 } |
698 | 700 |
699 string hkdf_input; | 701 string hkdf_input; |
700 const size_t label_len = strlen(QuicCryptoConfig::kInitialLabel) + 1; | 702 const size_t label_len = strlen(QuicCryptoConfig::kInitialLabel) + 1; |
701 hkdf_input.reserve(label_len + out_params->hkdf_input_suffix.size()); | 703 hkdf_input.reserve(label_len + out_params->hkdf_input_suffix.size()); |
702 hkdf_input.append(QuicCryptoConfig::kInitialLabel, label_len); | 704 hkdf_input.append(QuicCryptoConfig::kInitialLabel, label_len); |
703 hkdf_input.append(out_params->hkdf_input_suffix); | 705 hkdf_input.append(out_params->hkdf_input_suffix); |
704 | 706 |
705 string* subkey_secret = &out_params->initial_subkey_secret; | 707 string* subkey_secret = &out_params->initial_subkey_secret; |
| 708 |
| 709 // Only perform key diversification for QUIC versions 33 and later. |
| 710 // TODO(rch): remove the |actual_version| argument to this method when |
| 711 // QUIC_VERSION_32 is removed. |
| 712 CryptoUtils::Diversification diversification = |
| 713 actual_version > QUIC_VERSION_32 ? CryptoUtils::Diversification::Pending() |
| 714 : CryptoUtils::Diversification::Never(); |
706 if (!CryptoUtils::DeriveKeys(out_params->initial_premaster_secret, | 715 if (!CryptoUtils::DeriveKeys(out_params->initial_premaster_secret, |
707 out_params->aead, out_params->client_nonce, | 716 out_params->aead, out_params->client_nonce, |
708 out_params->server_nonce, hkdf_input, | 717 out_params->server_nonce, hkdf_input, |
709 Perspective::IS_CLIENT, | 718 Perspective::IS_CLIENT, diversification, |
710 &out_params->initial_crypters, subkey_secret)) { | 719 &out_params->initial_crypters, subkey_secret)) { |
711 *error_details = "Symmetric key setup failed"; | 720 *error_details = "Symmetric key setup failed"; |
712 return QUIC_CRYPTO_SYMMETRIC_KEY_SETUP_FAILED; | 721 return QUIC_CRYPTO_SYMMETRIC_KEY_SETUP_FAILED; |
713 } | 722 } |
714 | 723 |
715 return QUIC_NO_ERROR; | 724 return QUIC_NO_ERROR; |
716 } | 725 } |
717 | 726 |
718 QuicErrorCode QuicCryptoClientConfig::CacheNewServerConfig( | 727 QuicErrorCode QuicCryptoClientConfig::CacheNewServerConfig( |
719 const CryptoHandshakeMessage& message, | 728 const CryptoHandshakeMessage& message, |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
872 const size_t label_len = strlen(QuicCryptoConfig::kForwardSecureLabel) + 1; | 881 const size_t label_len = strlen(QuicCryptoConfig::kForwardSecureLabel) + 1; |
873 hkdf_input.reserve(label_len + out_params->hkdf_input_suffix.size()); | 882 hkdf_input.reserve(label_len + out_params->hkdf_input_suffix.size()); |
874 hkdf_input.append(QuicCryptoConfig::kForwardSecureLabel, label_len); | 883 hkdf_input.append(QuicCryptoConfig::kForwardSecureLabel, label_len); |
875 hkdf_input.append(out_params->hkdf_input_suffix); | 884 hkdf_input.append(out_params->hkdf_input_suffix); |
876 | 885 |
877 if (!CryptoUtils::DeriveKeys( | 886 if (!CryptoUtils::DeriveKeys( |
878 out_params->forward_secure_premaster_secret, out_params->aead, | 887 out_params->forward_secure_premaster_secret, out_params->aead, |
879 out_params->client_nonce, | 888 out_params->client_nonce, |
880 shlo_nonce.empty() ? out_params->server_nonce : shlo_nonce, | 889 shlo_nonce.empty() ? out_params->server_nonce : shlo_nonce, |
881 hkdf_input, Perspective::IS_CLIENT, | 890 hkdf_input, Perspective::IS_CLIENT, |
| 891 CryptoUtils::Diversification::Never(), |
882 &out_params->forward_secure_crypters, &out_params->subkey_secret)) { | 892 &out_params->forward_secure_crypters, &out_params->subkey_secret)) { |
883 *error_details = "Symmetric key setup failed"; | 893 *error_details = "Symmetric key setup failed"; |
884 return QUIC_CRYPTO_SYMMETRIC_KEY_SETUP_FAILED; | 894 return QUIC_CRYPTO_SYMMETRIC_KEY_SETUP_FAILED; |
885 } | 895 } |
886 | 896 |
887 return QUIC_NO_ERROR; | 897 return QUIC_NO_ERROR; |
888 } | 898 } |
889 | 899 |
890 QuicErrorCode QuicCryptoClientConfig::ProcessServerConfigUpdate( | 900 QuicErrorCode QuicCryptoClientConfig::ProcessServerConfigUpdate( |
891 const CryptoHandshakeMessage& server_config_update, | 901 const CryptoHandshakeMessage& server_config_update, |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
982 } | 992 } |
983 | 993 |
984 // Update canonical version to point at the "most recent" entry. | 994 // Update canonical version to point at the "most recent" entry. |
985 canonical_server_map_[suffix_server_id] = server_id; | 995 canonical_server_map_[suffix_server_id] = server_id; |
986 | 996 |
987 server_state->InitializeFrom(*canonical_state); | 997 server_state->InitializeFrom(*canonical_state); |
988 return true; | 998 return true; |
989 } | 999 } |
990 | 1000 |
991 } // namespace net | 1001 } // namespace net |
OLD | NEW |