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 450 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
461 | 461 |
462 if (result->error_code == QUIC_NO_ERROR) { | 462 if (result->error_code == QUIC_NO_ERROR) { |
463 EvaluateClientHello(primary_orbit, result, done_cb); | 463 EvaluateClientHello(primary_orbit, result, done_cb); |
464 } else { | 464 } else { |
465 done_cb->Run(result); | 465 done_cb->Run(result); |
466 } | 466 } |
467 } | 467 } |
468 | 468 |
469 QuicErrorCode QuicCryptoServerConfig::ProcessClientHello( | 469 QuicErrorCode QuicCryptoServerConfig::ProcessClientHello( |
470 const ValidateClientHelloResultCallback::Result& validate_chlo_result, | 470 const ValidateClientHelloResultCallback::Result& validate_chlo_result, |
471 QuicGuid guid, | 471 QuicConnectionId connection_id, |
472 IPEndPoint client_address, | 472 IPEndPoint client_address, |
473 QuicVersion version, | 473 QuicVersion version, |
474 const QuicVersionVector& supported_versions, | 474 const QuicVersionVector& supported_versions, |
475 const QuicClock* clock, | 475 const QuicClock* clock, |
476 QuicRandom* rand, | 476 QuicRandom* rand, |
477 QuicCryptoNegotiatedParameters *params, | 477 QuicCryptoNegotiatedParameters *params, |
478 CryptoHandshakeMessage* out, | 478 CryptoHandshakeMessage* out, |
479 string* error_details) const { | 479 string* error_details) const { |
480 DCHECK(error_details); | 480 DCHECK(error_details); |
481 | 481 |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
594 | 594 |
595 if (!info.sni.empty()) { | 595 if (!info.sni.empty()) { |
596 scoped_ptr<char[]> sni_tmp(new char[info.sni.length() + 1]); | 596 scoped_ptr<char[]> sni_tmp(new char[info.sni.length() + 1]); |
597 memcpy(sni_tmp.get(), info.sni.data(), info.sni.length()); | 597 memcpy(sni_tmp.get(), info.sni.data(), info.sni.length()); |
598 sni_tmp[info.sni.length()] = 0; | 598 sni_tmp[info.sni.length()] = 0; |
599 params->sni = CryptoUtils::NormalizeHostname(sni_tmp.get()); | 599 params->sni = CryptoUtils::NormalizeHostname(sni_tmp.get()); |
600 } | 600 } |
601 | 601 |
602 string hkdf_suffix; | 602 string hkdf_suffix; |
603 const QuicData& client_hello_serialized = client_hello.GetSerialized(); | 603 const QuicData& client_hello_serialized = client_hello.GetSerialized(); |
604 hkdf_suffix.reserve(sizeof(guid) + client_hello_serialized.length() + | 604 hkdf_suffix.reserve(sizeof(connection_id) + client_hello_serialized.length() + |
605 requested_config->serialized.size()); | 605 requested_config->serialized.size()); |
606 hkdf_suffix.append(reinterpret_cast<char*>(&guid), sizeof(guid)); | 606 hkdf_suffix.append(reinterpret_cast<char*>(&connection_id), |
| 607 sizeof(connection_id)); |
607 hkdf_suffix.append(client_hello_serialized.data(), | 608 hkdf_suffix.append(client_hello_serialized.data(), |
608 client_hello_serialized.length()); | 609 client_hello_serialized.length()); |
609 hkdf_suffix.append(requested_config->serialized); | 610 hkdf_suffix.append(requested_config->serialized); |
610 | 611 |
611 StringPiece cetv_ciphertext; | 612 StringPiece cetv_ciphertext; |
612 if (requested_config->channel_id_enabled && | 613 if (requested_config->channel_id_enabled && |
613 client_hello.GetStringPiece(kCETV, &cetv_ciphertext)) { | 614 client_hello.GetStringPiece(kCETV, &cetv_ciphertext)) { |
614 CryptoHandshakeMessage client_hello_copy(client_hello); | 615 CryptoHandshakeMessage client_hello_copy(client_hello); |
615 client_hello_copy.Erase(kCETV); | 616 client_hello_copy.Erase(kCETV); |
616 client_hello_copy.Erase(kPAD); | 617 client_hello_copy.Erase(kPAD); |
617 | 618 |
618 const QuicData& client_hello_serialized = client_hello_copy.GetSerialized(); | 619 const QuicData& client_hello_serialized = client_hello_copy.GetSerialized(); |
619 string hkdf_input; | 620 string hkdf_input; |
620 hkdf_input.append(QuicCryptoConfig::kCETVLabel, | 621 hkdf_input.append(QuicCryptoConfig::kCETVLabel, |
621 strlen(QuicCryptoConfig::kCETVLabel) + 1); | 622 strlen(QuicCryptoConfig::kCETVLabel) + 1); |
622 hkdf_input.append(reinterpret_cast<char*>(&guid), sizeof(guid)); | 623 hkdf_input.append(reinterpret_cast<char*>(&connection_id), |
| 624 sizeof(connection_id)); |
623 hkdf_input.append(client_hello_serialized.data(), | 625 hkdf_input.append(client_hello_serialized.data(), |
624 client_hello_serialized.length()); | 626 client_hello_serialized.length()); |
625 hkdf_input.append(requested_config->serialized); | 627 hkdf_input.append(requested_config->serialized); |
626 | 628 |
627 CrypterPair crypters; | 629 CrypterPair crypters; |
628 if (!CryptoUtils::DeriveKeys(params->initial_premaster_secret, params->aead, | 630 if (!CryptoUtils::DeriveKeys(params->initial_premaster_secret, params->aead, |
629 info.client_nonce, info.server_nonce, | 631 info.client_nonce, info.server_nonce, |
630 hkdf_input, CryptoUtils::SERVER, &crypters)) { | 632 hkdf_input, CryptoUtils::SERVER, &crypters)) { |
631 *error_details = "Symmetric key setup failed"; | 633 *error_details = "Symmetric key setup failed"; |
632 return QUIC_CRYPTO_SYMMETRIC_KEY_SETUP_FAILED; | 634 return QUIC_CRYPTO_SYMMETRIC_KEY_SETUP_FAILED; |
(...skipping 694 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1327 | 1329 |
1328 QuicCryptoServerConfig::Config::Config() | 1330 QuicCryptoServerConfig::Config::Config() |
1329 : channel_id_enabled(false), | 1331 : channel_id_enabled(false), |
1330 is_primary(false), | 1332 is_primary(false), |
1331 primary_time(QuicWallTime::Zero()), | 1333 primary_time(QuicWallTime::Zero()), |
1332 priority(0) {} | 1334 priority(0) {} |
1333 | 1335 |
1334 QuicCryptoServerConfig::Config::~Config() { STLDeleteElements(&key_exchanges); } | 1336 QuicCryptoServerConfig::Config::~Config() { STLDeleteElements(&key_exchanges); } |
1335 | 1337 |
1336 } // namespace net | 1338 } // namespace net |
OLD | NEW |