| // 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 "quiche/quic/core/crypto/transport_parameters.h" |
| #include "quiche/quic/core/quic_types.h" |
| #include "quiche/quic/core/quic_versions.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(int reason) = 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; |
| |
| // Called at the end of an handshake operation callback. |
| virtual void OnHandshakeCallbackDone() = 0; |
| |
| // Whether a packet flusher is currently attached. |
| virtual bool PacketFlusherAttached() const = 0; |
| |
| // Get the QUIC version currently in use. tls_handshaker needs this to pass |
| // to crypto_utils to apply version-dependent HKDF labels. |
| virtual ParsedQuicVersion parsed_version() const = 0; |
| }; |
| |
| } // namespace quic |
| |
| #endif // QUICHE_QUIC_CORE_HANDSHAKER_DELEGATE_INTERFACE_H_ |