Project import generated by Copybara.

PiperOrigin-RevId: 237361882
Change-Id: I109a68f44db867b20f8c6a7732b0ce657133e52a
diff --git a/quic/core/tls_client_handshaker.h b/quic/core/tls_client_handshaker.h
new file mode 100644
index 0000000..3e216f0
--- /dev/null
+++ b/quic/core/tls_client_handshaker.h
@@ -0,0 +1,127 @@
+// 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_CORE_TLS_CLIENT_HANDSHAKER_H_
+#define QUICHE_QUIC_CORE_TLS_CLIENT_HANDSHAKER_H_
+
+#include "third_party/boringssl/src/include/openssl/ssl.h"
+#include "net/third_party/quiche/src/quic/core/crypto/proof_verifier.h"
+#include "net/third_party/quiche/src/quic/core/quic_crypto_client_stream.h"
+#include "net/third_party/quiche/src/quic/core/quic_crypto_stream.h"
+#include "net/third_party/quiche/src/quic/core/tls_handshaker.h"
+#include "net/third_party/quiche/src/quic/platform/api/quic_export.h"
+#include "net/third_party/quiche/src/quic/platform/api/quic_string.h"
+
+namespace quic {
+
+// An implementation of QuicCryptoClientStream::HandshakerDelegate which uses
+// TLS 1.3 for the crypto handshake protocol.
+class QUIC_EXPORT_PRIVATE TlsClientHandshaker
+    : public QuicCryptoClientStream::HandshakerDelegate,
+      public TlsHandshaker {
+ public:
+  TlsClientHandshaker(QuicCryptoStream* stream,
+                      QuicSession* session,
+                      const QuicServerId& server_id,
+                      ProofVerifier* proof_verifier,
+                      SSL_CTX* ssl_ctx,
+                      std::unique_ptr<ProofVerifyContext> verify_context,
+                      const QuicString& user_agent_id);
+  TlsClientHandshaker(const TlsClientHandshaker&) = delete;
+  TlsClientHandshaker& operator=(const TlsClientHandshaker&) = delete;
+
+  ~TlsClientHandshaker() override;
+
+  // Creates and configures an SSL_CTX to be used with a TlsClientHandshaker.
+  // The caller is responsible for ownership of the newly created struct.
+  static bssl::UniquePtr<SSL_CTX> CreateSslCtx();
+
+  // From QuicCryptoClientStream::HandshakerDelegate
+  bool CryptoConnect() override;
+  int num_sent_client_hellos() const override;
+  int num_scup_messages_received() const override;
+  bool WasChannelIDSent() const override;
+  bool WasChannelIDSourceCallbackRun() const override;
+  QuicString chlo_hash() const override;
+
+  // From QuicCryptoClientStream::HandshakerDelegate and TlsHandshaker
+  bool encryption_established() const override;
+  bool handshake_confirmed() const override;
+  const QuicCryptoNegotiatedParameters& crypto_negotiated_params()
+      const override;
+  CryptoMessageParser* crypto_message_parser() override;
+
+ private:
+  // ProofVerifierCallbackImpl handles the result of an asynchronous certificate
+  // verification operation.
+  class ProofVerifierCallbackImpl : public ProofVerifierCallback {
+   public:
+    explicit ProofVerifierCallbackImpl(TlsClientHandshaker* parent);
+    ~ProofVerifierCallbackImpl() override;
+
+    // ProofVerifierCallback interface.
+    void Run(bool ok,
+             const QuicString& error_details,
+             std::unique_ptr<ProofVerifyDetails>* details) override;
+
+    // If called, Cancel causes the pending callback to be a no-op.
+    void Cancel();
+
+   private:
+    TlsClientHandshaker* parent_;
+  };
+
+  enum State {
+    STATE_IDLE,
+    STATE_HANDSHAKE_RUNNING,
+    STATE_CERT_VERIFY_PENDING,
+    STATE_HANDSHAKE_COMPLETE,
+    STATE_CONNECTION_CLOSED,
+  } state_ = STATE_IDLE;
+
+  bool SetTransportParameters();
+  bool ProcessTransportParameters(QuicString* error_details);
+  void FinishHandshake();
+
+  void AdvanceHandshake() override;
+  void CloseConnection(QuicErrorCode error,
+                       const QuicString& reason_phrase) override;
+
+  // Certificate verification functions:
+
+  enum ssl_verify_result_t VerifyCert(uint8_t* out_alert);
+  // Static method to supply to SSL_set_custom_verify.
+  static enum ssl_verify_result_t VerifyCallback(SSL* ssl, uint8_t* out_alert);
+
+  // Takes an SSL* |ssl| and returns a pointer to the TlsClientHandshaker that
+  // it belongs to. This is a specialization of
+  // TlsHandshaker::HandshakerFromSsl.
+  static TlsClientHandshaker* HandshakerFromSsl(SSL* ssl);
+
+  QuicServerId server_id_;
+
+  // Objects used for verifying the server's certificate chain.
+  // |proof_verifier_| is owned by the caller of TlsClientHandshaker's
+  // constructor.
+  ProofVerifier* proof_verifier_;
+  std::unique_ptr<ProofVerifyContext> verify_context_;
+
+  QuicString user_agent_id_;
+
+  // ProofVerifierCallback used for async certificate verification. This object
+  // is owned by |proof_verifier_|.
+  ProofVerifierCallbackImpl* proof_verify_callback_ = nullptr;
+  std::unique_ptr<ProofVerifyDetails> verify_details_;
+  enum ssl_verify_result_t verify_result_ = ssl_verify_retry;
+  QuicString cert_verify_error_details_;
+
+  bool encryption_established_ = false;
+  bool handshake_confirmed_ = false;
+  QuicReferenceCountedPointer<QuicCryptoNegotiatedParameters>
+      crypto_negotiated_params_;
+};
+
+}  // namespace quic
+
+#endif  // QUICHE_QUIC_CORE_TLS_CLIENT_HANDSHAKER_H_