| 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/core/crypto/quic_crypto_server_config.h" | 5 #include "net/quic/core/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 980 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 991 params->channel_id = key.as_string(); | 991 params->channel_id = key.as_string(); |
| 992 } | 992 } |
| 993 } | 993 } |
| 994 | 994 |
| 995 string hkdf_input; | 995 string hkdf_input; |
| 996 size_t label_len = strlen(QuicCryptoConfig::kInitialLabel) + 1; | 996 size_t label_len = strlen(QuicCryptoConfig::kInitialLabel) + 1; |
| 997 hkdf_input.reserve(label_len + hkdf_suffix.size()); | 997 hkdf_input.reserve(label_len + hkdf_suffix.size()); |
| 998 hkdf_input.append(QuicCryptoConfig::kInitialLabel, label_len); | 998 hkdf_input.append(QuicCryptoConfig::kInitialLabel, label_len); |
| 999 hkdf_input.append(hkdf_suffix); | 999 hkdf_input.append(hkdf_suffix); |
| 1000 | 1000 |
| 1001 rand->RandBytes(out_diversification_nonce->data(), |
| 1002 out_diversification_nonce->size()); |
| 1001 CryptoUtils::Diversification diversification = | 1003 CryptoUtils::Diversification diversification = |
| 1002 CryptoUtils::Diversification::Never(); | 1004 CryptoUtils::Diversification::Now(out_diversification_nonce.get()); |
| 1003 if (version > QUIC_VERSION_32) { | |
| 1004 rand->RandBytes(out_diversification_nonce->data(), | |
| 1005 out_diversification_nonce->size()); | |
| 1006 diversification = | |
| 1007 CryptoUtils::Diversification::Now(out_diversification_nonce.get()); | |
| 1008 } | |
| 1009 | |
| 1010 if (!CryptoUtils::DeriveKeys(params->initial_premaster_secret, params->aead, | 1005 if (!CryptoUtils::DeriveKeys(params->initial_premaster_secret, params->aead, |
| 1011 info.client_nonce, info.server_nonce, hkdf_input, | 1006 info.client_nonce, info.server_nonce, hkdf_input, |
| 1012 Perspective::IS_SERVER, diversification, | 1007 Perspective::IS_SERVER, diversification, |
| 1013 ¶ms->initial_crypters, | 1008 ¶ms->initial_crypters, |
| 1014 ¶ms->initial_subkey_secret)) { | 1009 ¶ms->initial_subkey_secret)) { |
| 1015 helper.Fail(QUIC_CRYPTO_SYMMETRIC_KEY_SETUP_FAILED, | 1010 helper.Fail(QUIC_CRYPTO_SYMMETRIC_KEY_SETUP_FAILED, |
| 1016 "Symmetric key setup failed"); | 1011 "Symmetric key setup failed"); |
| 1017 return; | 1012 return; |
| 1018 } | 1013 } |
| 1019 | 1014 |
| (...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1383 scoped_refptr<QuicSignedServerConfig> signed_config, | 1378 scoped_refptr<QuicSignedServerConfig> signed_config, |
| 1384 std::unique_ptr<ProofSource::Details> proof_source_details, | 1379 std::unique_ptr<ProofSource::Details> proof_source_details, |
| 1385 bool get_proof_failed, | 1380 bool get_proof_failed, |
| 1386 scoped_refptr<ValidateClientHelloResultCallback::Result> client_hello_state, | 1381 scoped_refptr<ValidateClientHelloResultCallback::Result> client_hello_state, |
| 1387 std::unique_ptr<ValidateClientHelloResultCallback> done_cb) const { | 1382 std::unique_ptr<ValidateClientHelloResultCallback> done_cb) const { |
| 1388 ValidateClientHelloHelper helper(client_hello_state, &done_cb); | 1383 ValidateClientHelloHelper helper(client_hello_state, &done_cb); |
| 1389 const CryptoHandshakeMessage& client_hello = client_hello_state->client_hello; | 1384 const CryptoHandshakeMessage& client_hello = client_hello_state->client_hello; |
| 1390 ClientHelloInfo* info = &(client_hello_state->info); | 1385 ClientHelloInfo* info = &(client_hello_state->info); |
| 1391 | 1386 |
| 1392 if (get_proof_failed) { | 1387 if (get_proof_failed) { |
| 1393 found_error = true; | |
| 1394 info->reject_reasons.push_back(SERVER_CONFIG_UNKNOWN_CONFIG_FAILURE); | 1388 info->reject_reasons.push_back(SERVER_CONFIG_UNKNOWN_CONFIG_FAILURE); |
| 1395 } | 1389 } |
| 1396 | 1390 |
| 1397 if (!ValidateExpectedLeafCertificate(client_hello, *signed_config)) { | 1391 if (!ValidateExpectedLeafCertificate(client_hello, *signed_config)) { |
| 1398 found_error = true; | |
| 1399 info->reject_reasons.push_back(INVALID_EXPECTED_LEAF_CERTIFICATE); | 1392 info->reject_reasons.push_back(INVALID_EXPECTED_LEAF_CERTIFICATE); |
| 1400 } | 1393 } |
| 1401 | 1394 |
| 1402 if (info->client_nonce.size() != kNonceSize) { | 1395 if (info->client_nonce.size() != kNonceSize) { |
| 1403 info->reject_reasons.push_back(CLIENT_NONCE_INVALID_FAILURE); | 1396 info->reject_reasons.push_back(CLIENT_NONCE_INVALID_FAILURE); |
| 1404 // Invalid client nonce. | 1397 // Invalid client nonce. |
| 1405 LOG(ERROR) << "Invalid client nonce: " << client_hello.DebugString(); | 1398 LOG(ERROR) << "Invalid client nonce: " << client_hello.DebugString(); |
| 1406 DVLOG(1) << "Invalid client nonce."; | 1399 DVLOG(1) << "Invalid client nonce."; |
| 1407 found_error = true; | |
| 1408 } | 1400 } |
| 1409 | 1401 |
| 1410 // Server nonce is optional, and used for key derivation if present. | 1402 // Server nonce is optional, and used for key derivation if present. |
| 1411 client_hello.GetStringPiece(kServerNonceTag, &info->server_nonce); | 1403 client_hello.GetStringPiece(kServerNonceTag, &info->server_nonce); |
| 1412 | 1404 |
| 1413 if (version > QUIC_VERSION_32) { | 1405 DVLOG(1) << "No 0-RTT replay protection in QUIC_VERSION_33 and higher."; |
| 1414 DVLOG(1) << "No 0-RTT replay protection in QUIC_VERSION_33 and higher."; | 1406 // If the server nonce is empty and we're requiring handshake confirmation |
| 1415 // If the server nonce is empty and we're requiring handshake confirmation | 1407 // for DoS reasons then we must reject the CHLO. |
| 1416 // for DoS reasons then we must reject the CHLO. | 1408 if (FLAGS_quic_require_handshake_confirmation && info->server_nonce.empty()) { |
| 1417 if (FLAGS_quic_require_handshake_confirmation && | 1409 info->reject_reasons.push_back(SERVER_NONCE_REQUIRED_FAILURE); |
| 1418 info->server_nonce.empty()) { | |
| 1419 info->reject_reasons.push_back(SERVER_NONCE_REQUIRED_FAILURE); | |
| 1420 } | |
| 1421 helper.ValidationComplete(QUIC_NO_ERROR, "", | |
| 1422 std::move(proof_source_details)); | |
| 1423 return; | |
| 1424 } | 1410 } |
| 1425 | 1411 helper.ValidationComplete(QUIC_NO_ERROR, "", std::move(proof_source_details)); |
| 1426 if (!replay_protection_) { | |
| 1427 DVLOG(1) << "No replay protection."; | |
| 1428 helper.ValidationComplete(QUIC_NO_ERROR, "", | |
| 1429 std::move(proof_source_details)); | |
| 1430 return; | |
| 1431 } | |
| 1432 | |
| 1433 if (!info->server_nonce.empty()) { | |
| 1434 // If the server nonce is present, use it to establish uniqueness. | |
| 1435 HandshakeFailureReason server_nonce_error = | |
| 1436 ValidateServerNonce(info->server_nonce, info->now); | |
| 1437 bool is_unique = server_nonce_error == HANDSHAKE_OK; | |
| 1438 if (!is_unique) { | |
| 1439 info->reject_reasons.push_back(server_nonce_error); | |
| 1440 } | |
| 1441 DVLOG(1) << "Using server nonce, unique: " << is_unique; | |
| 1442 helper.ValidationComplete(QUIC_NO_ERROR, "", | |
| 1443 std::move(proof_source_details)); | |
| 1444 return; | |
| 1445 } | |
| 1446 // If we hit this block, the server nonce was empty. If we're requiring | |
| 1447 // handshake confirmation for DoS reasons and there's no server nonce present, | |
| 1448 // reject the CHLO. | |
| 1449 if (FLAGS_quic_require_handshake_confirmation || | |
| 1450 FLAGS_quic_require_handshake_confirmation_pre33) { | |
| 1451 info->reject_reasons.push_back(SERVER_NONCE_REQUIRED_FAILURE); | |
| 1452 helper.ValidationComplete(QUIC_NO_ERROR, "", | |
| 1453 std::move(proof_source_details)); | |
| 1454 return; | |
| 1455 } | |
| 1456 | |
| 1457 // We want to contact strike register only if there are no errors because it | |
| 1458 // is a RPC call and is expensive. | |
| 1459 if (found_error) { | |
| 1460 helper.ValidationComplete(QUIC_NO_ERROR, "", | |
| 1461 std::move(proof_source_details)); | |
| 1462 return; | |
| 1463 } | |
| 1464 | |
| 1465 // Use the client nonce to establish uniqueness. | |
| 1466 StrikeRegisterClient* strike_register_client; | |
| 1467 { | |
| 1468 base::AutoLock locked(strike_register_client_lock_); | |
| 1469 strike_register_client = strike_register_client_.get(); | |
| 1470 } | |
| 1471 | |
| 1472 if (!strike_register_client) { | |
| 1473 // Either a valid server nonces or a strike register is required. | |
| 1474 // Since neither are present, reject the handshake which will send a | |
| 1475 // server nonce to the client. | |
| 1476 info->reject_reasons.push_back(SERVER_NONCE_REQUIRED_FAILURE); | |
| 1477 helper.ValidationComplete(QUIC_NO_ERROR, "", | |
| 1478 std::move(proof_source_details)); | |
| 1479 return; | |
| 1480 } | |
| 1481 | |
| 1482 strike_register_client->VerifyNonceIsValidAndUnique( | |
| 1483 info->client_nonce, info->now, | |
| 1484 new VerifyNonceIsValidAndUniqueCallback(client_hello_state, | |
| 1485 std::move(proof_source_details), | |
| 1486 std::move(done_cb))); | |
| 1487 helper.DetachCallback(); | |
| 1488 } | 1412 } |
| 1489 | 1413 |
| 1490 bool QuicCryptoServerConfig::BuildServerConfigUpdateMessage( | 1414 bool QuicCryptoServerConfig::BuildServerConfigUpdateMessage( |
| 1491 QuicVersion version, | 1415 QuicVersion version, |
| 1492 StringPiece chlo_hash, | 1416 StringPiece chlo_hash, |
| 1493 const SourceAddressTokens& previous_source_address_tokens, | 1417 const SourceAddressTokens& previous_source_address_tokens, |
| 1494 const IPAddress& server_ip, | 1418 const IPAddress& server_ip, |
| 1495 const IPAddress& client_ip, | 1419 const IPAddress& client_ip, |
| 1496 const QuicClock* clock, | 1420 const QuicClock* clock, |
| 1497 QuicRandom* rand, | 1421 QuicRandom* rand, |
| (...skipping 780 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2278 source_address_token_boxer(nullptr) {} | 2202 source_address_token_boxer(nullptr) {} |
| 2279 | 2203 |
| 2280 QuicCryptoServerConfig::Config::~Config() { | 2204 QuicCryptoServerConfig::Config::~Config() { |
| 2281 } | 2205 } |
| 2282 | 2206 |
| 2283 QuicSignedServerConfig::QuicSignedServerConfig() | 2207 QuicSignedServerConfig::QuicSignedServerConfig() |
| 2284 : send_expect_ct_header(false) {} | 2208 : send_expect_ct_header(false) {} |
| 2285 QuicSignedServerConfig::~QuicSignedServerConfig() {} | 2209 QuicSignedServerConfig::~QuicSignedServerConfig() {} |
| 2286 | 2210 |
| 2287 } // namespace net | 2211 } // namespace net |
| OLD | NEW |