| 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 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 | 10 |
| (...skipping 589 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 600 *error_details = validate_chlo_result.error_details; | 600 *error_details = validate_chlo_result.error_details; |
| 601 return validate_chlo_result.error_code; | 601 return validate_chlo_result.error_code; |
| 602 } | 602 } |
| 603 | 603 |
| 604 out->Clear(); | 604 out->Clear(); |
| 605 | 605 |
| 606 bool x509_supported = false; | 606 bool x509_supported = false; |
| 607 bool x509_ecdsa_supported = false; | 607 bool x509_ecdsa_supported = false; |
| 608 ParseProofDemand(client_hello, &x509_supported, &x509_ecdsa_supported); | 608 ParseProofDemand(client_hello, &x509_supported, &x509_ecdsa_supported); |
| 609 DCHECK(proof_source_.get()); | 609 DCHECK(proof_source_.get()); |
| 610 string chlo_hash; |
| 611 CryptoUtils::HashHandshakeMessage(client_hello, &chlo_hash); |
| 610 if (!crypto_proof->chain && | 612 if (!crypto_proof->chain && |
| 611 !proof_source_->GetProof(server_ip, info.sni.as_string(), | 613 !proof_source_->GetProof( |
| 612 primary_config->serialized, x509_ecdsa_supported, | 614 server_ip, info.sni.as_string(), primary_config->serialized, version, |
| 613 &crypto_proof->chain, &crypto_proof->signature, | 615 chlo_hash, x509_ecdsa_supported, &crypto_proof->chain, |
| 614 &crypto_proof->cert_sct)) { | 616 &crypto_proof->signature, &crypto_proof->cert_sct)) { |
| 615 return QUIC_HANDSHAKE_FAILED; | 617 return QUIC_HANDSHAKE_FAILED; |
| 616 } | 618 } |
| 617 | 619 |
| 618 if (version > QUIC_VERSION_29) { | 620 if (version > QUIC_VERSION_29) { |
| 619 StringPiece cert_sct; | 621 StringPiece cert_sct; |
| 620 if (client_hello.GetStringPiece(kCertificateSCTTag, &cert_sct) && | 622 if (client_hello.GetStringPiece(kCertificateSCTTag, &cert_sct) && |
| 621 cert_sct.empty()) { | 623 cert_sct.empty()) { |
| 622 params->sct_supported_by_client = true; | 624 params->sct_supported_by_client = true; |
| 623 } | 625 } |
| 624 } | 626 } |
| (...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1054 return; | 1056 return; |
| 1055 } | 1057 } |
| 1056 found_error = true; | 1058 found_error = true; |
| 1057 } | 1059 } |
| 1058 | 1060 |
| 1059 if (version > QUIC_VERSION_25) { | 1061 if (version > QUIC_VERSION_25) { |
| 1060 bool x509_supported = false; | 1062 bool x509_supported = false; |
| 1061 bool x509_ecdsa_supported = false; | 1063 bool x509_ecdsa_supported = false; |
| 1062 ParseProofDemand(client_hello, &x509_supported, &x509_ecdsa_supported); | 1064 ParseProofDemand(client_hello, &x509_supported, &x509_ecdsa_supported); |
| 1063 string serialized_config = primary_config->serialized; | 1065 string serialized_config = primary_config->serialized; |
| 1064 if (!proof_source_->GetProof(server_ip, info->sni.as_string(), | 1066 string chlo_hash; |
| 1065 serialized_config, x509_ecdsa_supported, | 1067 CryptoUtils::HashHandshakeMessage(client_hello, &chlo_hash); |
| 1066 &crypto_proof->chain, &crypto_proof->signature, | 1068 if (!proof_source_->GetProof( |
| 1067 &crypto_proof->cert_sct)) { | 1069 server_ip, info->sni.as_string(), serialized_config, version, |
| 1070 chlo_hash, x509_ecdsa_supported, &crypto_proof->chain, |
| 1071 &crypto_proof->signature, &crypto_proof->cert_sct)) { |
| 1068 found_error = true; | 1072 found_error = true; |
| 1069 info->reject_reasons.push_back(SERVER_CONFIG_UNKNOWN_CONFIG_FAILURE); | 1073 info->reject_reasons.push_back(SERVER_CONFIG_UNKNOWN_CONFIG_FAILURE); |
| 1070 } | 1074 } |
| 1071 | 1075 |
| 1072 if (!ValidateExpectedLeafCertificate(client_hello, *crypto_proof)) { | 1076 if (!ValidateExpectedLeafCertificate(client_hello, *crypto_proof)) { |
| 1073 found_error = true; | 1077 found_error = true; |
| 1074 info->reject_reasons.push_back(INVALID_EXPECTED_LEAF_CERTIFICATE); | 1078 info->reject_reasons.push_back(INVALID_EXPECTED_LEAF_CERTIFICATE); |
| 1075 } | 1079 } |
| 1076 } | 1080 } |
| 1077 | 1081 |
| 1078 if (!client_hello.GetStringPiece(kNONC, &info->client_nonce) || | 1082 if (!client_hello.GetStringPiece(kNONC, &info->client_nonce) || |
| 1079 info->client_nonce.size() != kNonceSize) { | 1083 info->client_nonce.size() != kNonceSize) { |
| 1080 info->reject_reasons.push_back(CLIENT_NONCE_INVALID_FAILURE); | 1084 info->reject_reasons.push_back(CLIENT_NONCE_INVALID_FAILURE); |
| 1081 // Invalid client nonce. | 1085 // Invalid client nonce. |
| 1082 DVLOG(1) << "Invalid client nonce."; | 1086 DVLOG(1) << "Invalid client nonce."; |
| 1083 if (FLAGS_use_early_return_when_verifying_chlo) { | 1087 if (FLAGS_use_early_return_when_verifying_chlo) { |
| 1084 helper.ValidationComplete(QUIC_NO_ERROR, ""); | 1088 helper.ValidationComplete(QUIC_NO_ERROR, ""); |
| 1085 return; | 1089 return; |
| 1086 } | 1090 } |
| 1087 found_error = true; | 1091 found_error = true; |
| 1088 } | 1092 } |
| 1089 | 1093 |
| 1090 // Server nonce is optional, and used for key derivation if present. | 1094 // Server nonce is optional, and used for key derivation if present. |
| 1091 client_hello.GetStringPiece(kServerNonceTag, &info->server_nonce); | 1095 client_hello.GetStringPiece(kServerNonceTag, &info->server_nonce); |
| 1092 | 1096 |
| 1093 if (version > QUIC_VERSION_30) { | 1097 if (version > QUIC_VERSION_31) { |
| 1094 DVLOG(1) << "No 0-RTT replay protection in QUIC_VERSION_31 and higher."; | 1098 DVLOG(1) << "No 0-RTT replay protection in QUIC_VERSION_32 and higher."; |
| 1095 // If the server nonce is empty and we're requiring handshake confirmation | 1099 // If the server nonce is empty and we're requiring handshake confirmation |
| 1096 // for DoS reasons then we must reject the CHLO. | 1100 // for DoS reasons then we must reject the CHLO. |
| 1097 if (FLAGS_quic_require_handshake_confirmation && | 1101 if (FLAGS_quic_require_handshake_confirmation && |
| 1098 info->server_nonce.empty()) { | 1102 info->server_nonce.empty()) { |
| 1099 info->reject_reasons.push_back(SERVER_NONCE_REQUIRED_FAILURE); | 1103 info->reject_reasons.push_back(SERVER_NONCE_REQUIRED_FAILURE); |
| 1100 } | 1104 } |
| 1101 helper.ValidationComplete(QUIC_NO_ERROR, ""); | 1105 helper.ValidationComplete(QUIC_NO_ERROR, ""); |
| 1102 return; | 1106 return; |
| 1103 } | 1107 } |
| 1104 | 1108 |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1185 out->SetStringPiece(kSCFG, primary_config_->serialized); | 1189 out->SetStringPiece(kSCFG, primary_config_->serialized); |
| 1186 out->SetStringPiece( | 1190 out->SetStringPiece( |
| 1187 kSourceAddressTokenTag, | 1191 kSourceAddressTokenTag, |
| 1188 NewSourceAddressToken(*primary_config_.get(), | 1192 NewSourceAddressToken(*primary_config_.get(), |
| 1189 previous_source_address_tokens, client_ip, rand, | 1193 previous_source_address_tokens, client_ip, rand, |
| 1190 clock->WallNow(), cached_network_params)); | 1194 clock->WallNow(), cached_network_params)); |
| 1191 | 1195 |
| 1192 scoped_refptr<ProofSource::Chain> chain; | 1196 scoped_refptr<ProofSource::Chain> chain; |
| 1193 string signature; | 1197 string signature; |
| 1194 string cert_sct; | 1198 string cert_sct; |
| 1195 if (!proof_source_->GetProof( | 1199 if (!proof_source_->GetProof(server_ip, params.sni, |
| 1196 server_ip, params.sni, primary_config_->serialized, | 1200 primary_config_->serialized, version, |
| 1197 params.x509_ecdsa_supported, &chain, &signature, &cert_sct)) { | 1201 params.client_nonce, params.x509_ecdsa_supported, |
| 1202 &chain, &signature, &cert_sct)) { |
| 1198 DVLOG(1) << "Server: failed to get proof."; | 1203 DVLOG(1) << "Server: failed to get proof."; |
| 1199 return false; | 1204 return false; |
| 1200 } | 1205 } |
| 1201 | 1206 |
| 1202 const string compressed = CertCompressor::CompressChain( | 1207 const string compressed = CertCompressor::CompressChain( |
| 1203 chain->certs, params.client_common_set_hashes, | 1208 chain->certs, params.client_common_set_hashes, |
| 1204 params.client_cached_cert_hashes, primary_config_->common_cert_sets); | 1209 params.client_cached_cert_hashes, primary_config_->common_cert_sets); |
| 1205 | 1210 |
| 1206 out->SetStringPiece(kCertificateTag, compressed); | 1211 out->SetStringPiece(kCertificateTag, compressed); |
| 1207 out->SetStringPiece(kPROF, signature); | 1212 out->SetStringPiece(kPROF, signature); |
| (...skipping 598 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1806 priority(0), | 1811 priority(0), |
| 1807 source_address_token_boxer(nullptr) {} | 1812 source_address_token_boxer(nullptr) {} |
| 1808 | 1813 |
| 1809 QuicCryptoServerConfig::Config::~Config() { | 1814 QuicCryptoServerConfig::Config::~Config() { |
| 1810 STLDeleteElements(&key_exchanges); | 1815 STLDeleteElements(&key_exchanges); |
| 1811 } | 1816 } |
| 1812 | 1817 |
| 1813 QuicCryptoProof::QuicCryptoProof() {} | 1818 QuicCryptoProof::QuicCryptoProof() {} |
| 1814 QuicCryptoProof::~QuicCryptoProof() {} | 1819 QuicCryptoProof::~QuicCryptoProof() {} |
| 1815 } // namespace net | 1820 } // namespace net |
| OLD | NEW |