// Copyright (c) 2019 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_HANDSHAKER_DELEGATE_INTERFACE_H_
#define QUICHE_QUIC_CORE_HANDSHAKER_DELEGATE_INTERFACE_H_

#include "net/third_party/quiche/src/quic/core/crypto/transport_parameters.h"
#include "net/third_party/quiche/src/quic/core/quic_types.h"

namespace quic {

class QuicDecrypter;
class QuicEncrypter;

// Pure virtual class to get notified when particular handshake events occurred.
class QUIC_EXPORT_PRIVATE HandshakerDelegateInterface {
 public:
  virtual ~HandshakerDelegateInterface() {}

  // Called when new decryption key of |level| is available. Returns true if
  // decrypter is set successfully, otherwise, returns false.
  virtual bool OnNewDecryptionKeyAvailable(
      EncryptionLevel level,
      std::unique_ptr<QuicDecrypter> decrypter,
      bool set_alternative_decrypter,
      bool latch_once_used) = 0;

  // Called when new encryption key of |level| is available.
  virtual void OnNewEncryptionKeyAvailable(
      EncryptionLevel level,
      std::unique_ptr<QuicEncrypter> encrypter) = 0;

  // Called to set default encryption level to |level|. Only used in QUIC
  // crypto.
  virtual void SetDefaultEncryptionLevel(EncryptionLevel level) = 0;

  // Called when both 1-RTT read and write keys are available. Only used in TLS
  // handshake.
  virtual void OnTlsHandshakeComplete() = 0;

  // Called to discard old decryption keys to stop processing packets of
  // encryption |level|.
  virtual void DiscardOldDecryptionKey(EncryptionLevel level) = 0;

  // Called to discard old encryption keys (and neuter obsolete data).
  // TODO(fayang): consider to combine this with DiscardOldDecryptionKey.
  virtual void DiscardOldEncryptionKey(EncryptionLevel level) = 0;

  // Called to neuter ENCRYPTION_INITIAL data (without discarding initial keys).
  virtual void NeuterUnencryptedData() = 0;

  // Called to neuter data of HANDSHAKE_DATA packet number space. Only used in
  // QUIC crypto. This is called 1) when a client switches to forward secure
  // encryption level and 2) a server successfully processes a forward secure
  // packet.
  virtual void NeuterHandshakeData() = 0;

  // Called when 0-RTT data is rejected by the server. This is only called in
  // TLS handshakes and only called on clients.
  virtual void OnZeroRttRejected() = 0;

  // Fills in |params| with values from the delegate's QuicConfig.
  // Returns whether the operation succeeded.
  virtual bool FillTransportParameters(TransportParameters* params) = 0;

  // Read |params| and apply the values to the delegate's QuicConfig.
  // On failure, returns a QuicErrorCode and saves a detailed error in
  // |error_details|.
  virtual QuicErrorCode ProcessTransportParameters(
      const TransportParameters& params,
      bool is_resumption,
      std::string* error_details) = 0;
};

}  // namespace quic

#endif  // QUICHE_QUIC_CORE_HANDSHAKER_DELEGATE_INTERFACE_H_
