| // Copyright (c) 2017 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef QUICHE_QUIC_QUARTC_QUARTC_CRYPTO_HELPERS_H_ | |
| #define QUICHE_QUIC_QUARTC_QUARTC_CRYPTO_HELPERS_H_ | |
| #include <string> | |
| #include "net/third_party/quiche/src/quic/core/crypto/crypto_handshake_message.h" | |
| #include "net/third_party/quiche/src/quic/core/crypto/proof_source.h" | |
| #include "net/third_party/quiche/src/quic/core/crypto/proof_verifier.h" | |
| #include "net/third_party/quiche/src/quic/core/crypto/quic_crypto_client_config.h" | |
| #include "net/third_party/quiche/src/quic/core/crypto/quic_crypto_server_config.h" | |
| #include "net/third_party/quiche/src/quic/core/quic_connection_id.h" | |
| #include "net/third_party/quiche/src/quic/core/quic_crypto_server_stream.h" | |
| #include "net/third_party/quiche/src/quic/core/quic_versions.h" | |
| #include "net/third_party/quiche/src/quic/platform/api/quic_reference_counted.h" | |
| #include "net/third_party/quiche/src/quic/platform/api/quic_socket_address.h" | |
| #include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" | |
| namespace quic { | |
| // Never, ever, change this certificate name. You will break 0-rtt handshake if | |
| // you do. | |
| static constexpr char kDummyCertName[] = "Dummy cert"; | |
| struct CryptoServerConfig { | |
| std::unique_ptr<QuicCryptoServerConfig> config; | |
| std::string serialized_crypto_config; | |
| }; | |
| // Length of HKDF input keying material, equal to its number of bytes. | |
| // https://tools.ietf.org/html/rfc5869#section-2.2. | |
| // TODO(zhihuang): Verify that input keying material length is correct. | |
| constexpr size_t kInputKeyingMaterialLength = 32; | |
| // Used by QuicCryptoServerConfig to provide dummy proof credentials. | |
| // TODO(zhihuang): Remove when secure P2P QUIC handshake is possible. | |
| class DummyProofSource : public ProofSource { | |
| public: | |
| DummyProofSource() {} | |
| ~DummyProofSource() override {} | |
| // ProofSource overrides. | |
| void GetProof(const QuicSocketAddress& server_address, | |
| const std::string& hostname, | |
| const std::string& server_config, | |
| QuicTransportVersion transport_version, | |
| quiche::QuicheStringPiece chlo_hash, | |
| std::unique_ptr<Callback> callback) override; | |
| QuicReferenceCountedPointer<Chain> GetCertChain( | |
| const QuicSocketAddress& server_address, | |
| const std::string& hostname) override; | |
| void ComputeTlsSignature( | |
| const QuicSocketAddress& server_address, | |
| const std::string& hostname, | |
| uint16_t signature_algorithm, | |
| quiche::QuicheStringPiece in, | |
| std::unique_ptr<SignatureCallback> callback) override; | |
| }; | |
| // Used by QuicCryptoClientConfig to ignore the peer's credentials | |
| // and establish an insecure QUIC connection. | |
| // TODO(zhihuang): Remove when secure P2P QUIC handshake is possible. | |
| class InsecureProofVerifier : public ProofVerifier { | |
| public: | |
| InsecureProofVerifier() {} | |
| ~InsecureProofVerifier() override {} | |
| // ProofVerifier overrides. | |
| QuicAsyncStatus VerifyProof( | |
| const std::string& hostname, | |
| const uint16_t port, | |
| const std::string& server_config, | |
| QuicTransportVersion transport_version, | |
| quiche::QuicheStringPiece chlo_hash, | |
| const std::vector<std::string>& certs, | |
| const std::string& cert_sct, | |
| const std::string& signature, | |
| const ProofVerifyContext* context, | |
| std::string* error_details, | |
| std::unique_ptr<ProofVerifyDetails>* verify_details, | |
| std::unique_ptr<ProofVerifierCallback> callback) override; | |
| QuicAsyncStatus VerifyCertChain( | |
| const std::string& hostname, | |
| const std::vector<std::string>& certs, | |
| const std::string& ocsp_response, | |
| const std::string& cert_sct, | |
| const ProofVerifyContext* context, | |
| std::string* error_details, | |
| std::unique_ptr<ProofVerifyDetails>* details, | |
| std::unique_ptr<ProofVerifierCallback> callback) override; | |
| std::unique_ptr<ProofVerifyContext> CreateDefaultContext() override; | |
| }; | |
| // Implementation of the server-side crypto stream helper. | |
| class QuartcCryptoServerStreamHelper : public QuicCryptoServerStream::Helper { | |
| public: | |
| bool CanAcceptClientHello(const CryptoHandshakeMessage& message, | |
| const QuicSocketAddress& client_address, | |
| const QuicSocketAddress& peer_address, | |
| const QuicSocketAddress& self_address, | |
| std::string* error_details) const override; | |
| }; | |
| std::unique_ptr<QuicCryptoClientConfig> CreateCryptoClientConfig( | |
| quiche::QuicheStringPiece pre_shared_key); | |
| CryptoServerConfig CreateCryptoServerConfig( | |
| QuicRandom* random, | |
| const QuicClock* clock, | |
| quiche::QuicheStringPiece pre_shared_key); | |
| } // namespace quic | |
| #endif // QUICHE_QUIC_QUARTC_QUARTC_CRYPTO_HELPERS_H_ |