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 #include <memory> | 10 #include <memory> |
(...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
597 if (validate_chlo_result.error_code != QUIC_NO_ERROR) { | 597 if (validate_chlo_result.error_code != QUIC_NO_ERROR) { |
598 *error_details = validate_chlo_result.error_details; | 598 *error_details = validate_chlo_result.error_details; |
599 return validate_chlo_result.error_code; | 599 return validate_chlo_result.error_code; |
600 } | 600 } |
601 | 601 |
602 out->Clear(); | 602 out->Clear(); |
603 | 603 |
604 bool x509_supported = false; | 604 bool x509_supported = false; |
605 bool x509_ecdsa_supported = false; | 605 bool x509_ecdsa_supported = false; |
606 ParseProofDemand(client_hello, &x509_supported, &x509_ecdsa_supported); | 606 ParseProofDemand(client_hello, &x509_supported, &x509_ecdsa_supported); |
| 607 if (!x509_supported && FLAGS_quic_require_x509) { |
| 608 *error_details = "Missing or invalid PDMD"; |
| 609 return QUIC_INVALID_CRYPTO_MESSAGE_PARAMETER; |
| 610 } |
607 DCHECK(proof_source_.get()); | 611 DCHECK(proof_source_.get()); |
608 string chlo_hash; | 612 string chlo_hash; |
609 CryptoUtils::HashHandshakeMessage(client_hello, &chlo_hash); | 613 CryptoUtils::HashHandshakeMessage(client_hello, &chlo_hash); |
610 if (!crypto_proof->chain && | 614 if (!crypto_proof->chain && |
611 !proof_source_->GetProof( | 615 !proof_source_->GetProof( |
612 server_ip, info.sni.as_string(), primary_config->serialized, version, | 616 server_ip, info.sni.as_string(), primary_config->serialized, version, |
613 chlo_hash, x509_ecdsa_supported, &crypto_proof->chain, | 617 chlo_hash, x509_ecdsa_supported, &crypto_proof->chain, |
614 &crypto_proof->signature, &crypto_proof->cert_sct)) { | 618 &crypto_proof->signature, &crypto_proof->cert_sct)) { |
615 return QUIC_HANDSHAKE_FAILED; | 619 return QUIC_HANDSHAKE_FAILED; |
616 } | 620 } |
(...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1156 StringPiece chlo_hash, | 1160 StringPiece chlo_hash, |
1157 const SourceAddressTokens& previous_source_address_tokens, | 1161 const SourceAddressTokens& previous_source_address_tokens, |
1158 const IPAddress& server_ip, | 1162 const IPAddress& server_ip, |
1159 const IPAddress& client_ip, | 1163 const IPAddress& client_ip, |
1160 const QuicClock* clock, | 1164 const QuicClock* clock, |
1161 QuicRandom* rand, | 1165 QuicRandom* rand, |
1162 QuicCompressedCertsCache* compressed_certs_cache, | 1166 QuicCompressedCertsCache* compressed_certs_cache, |
1163 const QuicCryptoNegotiatedParameters& params, | 1167 const QuicCryptoNegotiatedParameters& params, |
1164 const CachedNetworkParameters* cached_network_params, | 1168 const CachedNetworkParameters* cached_network_params, |
1165 CryptoHandshakeMessage* out) const { | 1169 CryptoHandshakeMessage* out) const { |
1166 base::AutoLock locked(configs_lock_); | 1170 string serialized; |
| 1171 string source_address_token; |
| 1172 const CommonCertSets* common_cert_sets; |
| 1173 { |
| 1174 base::AutoLock locked(configs_lock_); |
| 1175 serialized = primary_config_->serialized; |
| 1176 common_cert_sets = primary_config_->common_cert_sets; |
| 1177 source_address_token = NewSourceAddressToken( |
| 1178 *primary_config_, previous_source_address_tokens, client_ip, rand, |
| 1179 clock->WallNow(), cached_network_params); |
| 1180 } |
| 1181 |
1167 out->set_tag(kSCUP); | 1182 out->set_tag(kSCUP); |
1168 out->SetStringPiece(kSCFG, primary_config_->serialized); | 1183 out->SetStringPiece(kSCFG, serialized); |
1169 out->SetStringPiece( | 1184 out->SetStringPiece(kSourceAddressTokenTag, source_address_token); |
1170 kSourceAddressTokenTag, | |
1171 NewSourceAddressToken(*primary_config_.get(), | |
1172 previous_source_address_tokens, client_ip, rand, | |
1173 clock->WallNow(), cached_network_params)); | |
1174 | 1185 |
1175 scoped_refptr<ProofSource::Chain> chain; | 1186 scoped_refptr<ProofSource::Chain> chain; |
1176 string signature; | 1187 string signature; |
1177 string cert_sct; | 1188 string cert_sct; |
1178 if (FLAGS_quic_use_hash_in_scup) { | 1189 if (FLAGS_quic_use_hash_in_scup) { |
1179 if (!proof_source_->GetProof(server_ip, params.sni, | 1190 if (!proof_source_->GetProof(server_ip, params.sni, serialized, version, |
1180 primary_config_->serialized, version, | |
1181 chlo_hash, params.x509_ecdsa_supported, &chain, | 1191 chlo_hash, params.x509_ecdsa_supported, &chain, |
1182 &signature, &cert_sct)) { | 1192 &signature, &cert_sct)) { |
1183 DVLOG(1) << "Server: failed to get proof."; | 1193 DVLOG(1) << "Server: failed to get proof."; |
1184 return false; | 1194 return false; |
1185 } | 1195 } |
1186 } else { | 1196 } else { |
1187 if (!proof_source_->GetProof( | 1197 if (!proof_source_->GetProof( |
1188 server_ip, params.sni, primary_config_->serialized, version, | 1198 server_ip, params.sni, serialized, version, params.client_nonce, |
1189 params.client_nonce, params.x509_ecdsa_supported, &chain, | 1199 params.x509_ecdsa_supported, &chain, &signature, &cert_sct)) { |
1190 &signature, &cert_sct)) { | |
1191 DVLOG(1) << "Server: failed to get proof."; | 1200 DVLOG(1) << "Server: failed to get proof."; |
1192 return false; | 1201 return false; |
1193 } | 1202 } |
1194 } | 1203 } |
1195 | 1204 |
1196 const string compressed = CompressChain( | 1205 const string compressed = CompressChain( |
1197 compressed_certs_cache, chain, params.client_common_set_hashes, | 1206 compressed_certs_cache, chain, params.client_common_set_hashes, |
1198 params.client_cached_cert_hashes, primary_config_->common_cert_sets); | 1207 params.client_cached_cert_hashes, common_cert_sets); |
1199 | 1208 |
1200 out->SetStringPiece(kCertificateTag, compressed); | 1209 out->SetStringPiece(kCertificateTag, compressed); |
1201 out->SetStringPiece(kPROF, signature); | 1210 out->SetStringPiece(kPROF, signature); |
1202 if (params.sct_supported_by_client && version > QUIC_VERSION_29 && | 1211 if (params.sct_supported_by_client && version > QUIC_VERSION_29 && |
1203 enable_serving_sct_) { | 1212 enable_serving_sct_) { |
1204 if (cert_sct.empty()) { | 1213 if (cert_sct.empty()) { |
1205 DLOG(WARNING) << "SCT is expected but it is empty."; | 1214 DLOG(WARNING) << "SCT is expected but it is empty."; |
1206 } else { | 1215 } else { |
1207 out->SetStringPiece(kCertificateSCTTag, cert_sct); | 1216 out->SetStringPiece(kCertificateSCTTag, cert_sct); |
1208 } | 1217 } |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1242 } | 1251 } |
1243 | 1252 |
1244 // Send client the reject reason for debugging purposes. | 1253 // Send client the reject reason for debugging purposes. |
1245 DCHECK_LT(0u, info.reject_reasons.size()); | 1254 DCHECK_LT(0u, info.reject_reasons.size()); |
1246 out->SetVector(kRREJ, info.reject_reasons); | 1255 out->SetVector(kRREJ, info.reject_reasons); |
1247 | 1256 |
1248 // The client may have requested a certificate chain. | 1257 // The client may have requested a certificate chain. |
1249 bool x509_supported = false; | 1258 bool x509_supported = false; |
1250 ParseProofDemand(client_hello, &x509_supported, | 1259 ParseProofDemand(client_hello, &x509_supported, |
1251 ¶ms->x509_ecdsa_supported); | 1260 ¶ms->x509_ecdsa_supported); |
1252 if (!x509_supported) { | 1261 if (!x509_supported && FLAGS_quic_require_x509) { |
| 1262 QUIC_BUG << "x509 certificates not supported in proof demand"; |
1253 return; | 1263 return; |
1254 } | 1264 } |
1255 | 1265 |
1256 StringPiece client_common_set_hashes; | 1266 StringPiece client_common_set_hashes; |
1257 if (client_hello.GetStringPiece(kCCS, &client_common_set_hashes)) { | 1267 if (client_hello.GetStringPiece(kCCS, &client_common_set_hashes)) { |
1258 params->client_common_set_hashes = client_common_set_hashes.as_string(); | 1268 params->client_common_set_hashes = client_common_set_hashes.as_string(); |
1259 } | 1269 } |
1260 | 1270 |
1261 StringPiece client_cached_cert_hashes; | 1271 StringPiece client_cached_cert_hashes; |
1262 if (client_hello.GetStringPiece(kCCRT, &client_cached_cert_hashes)) { | 1272 if (client_hello.GetStringPiece(kCCRT, &client_cached_cert_hashes)) { |
(...skipping 563 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1826 priority(0), | 1836 priority(0), |
1827 source_address_token_boxer(nullptr) {} | 1837 source_address_token_boxer(nullptr) {} |
1828 | 1838 |
1829 QuicCryptoServerConfig::Config::~Config() { | 1839 QuicCryptoServerConfig::Config::~Config() { |
1830 STLDeleteElements(&key_exchanges); | 1840 STLDeleteElements(&key_exchanges); |
1831 } | 1841 } |
1832 | 1842 |
1833 QuicCryptoProof::QuicCryptoProof() {} | 1843 QuicCryptoProof::QuicCryptoProof() {} |
1834 QuicCryptoProof::~QuicCryptoProof() {} | 1844 QuicCryptoProof::~QuicCryptoProof() {} |
1835 } // namespace net | 1845 } // namespace net |
OLD | NEW |