blob: d6e250100378c6392b3931237c8ec6940f659ae0 [file] [log] [blame]
Bence Békybac04052022-04-07 15:44:29 -04001// Copyright (c) 2019 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef QUICHE_QUIC_CORE_HANDSHAKER_DELEGATE_INTERFACE_H_
6#define QUICHE_QUIC_CORE_HANDSHAKER_DELEGATE_INTERFACE_H_
7
8#include "quiche/quic/core/crypto/transport_parameters.h"
9#include "quiche/quic/core/quic_types.h"
10#include "quiche/quic/core/quic_versions.h"
11
12namespace quic {
13
14class QuicDecrypter;
15class QuicEncrypter;
16
17// Pure virtual class to get notified when particular handshake events occurred.
18class QUIC_EXPORT_PRIVATE HandshakerDelegateInterface {
19 public:
20 virtual ~HandshakerDelegateInterface() {}
21
22 // Called when new decryption key of |level| is available. Returns true if
23 // decrypter is set successfully, otherwise, returns false.
24 virtual bool OnNewDecryptionKeyAvailable(
25 EncryptionLevel level, std::unique_ptr<QuicDecrypter> decrypter,
26 bool set_alternative_decrypter, bool latch_once_used) = 0;
27
28 // Called when new encryption key of |level| is available.
29 virtual void OnNewEncryptionKeyAvailable(
30 EncryptionLevel level, std::unique_ptr<QuicEncrypter> encrypter) = 0;
31
32 // Called to set default encryption level to |level|. Only used in QUIC
33 // crypto.
34 virtual void SetDefaultEncryptionLevel(EncryptionLevel level) = 0;
35
36 // Called when both 1-RTT read and write keys are available. Only used in TLS
37 // handshake.
38 virtual void OnTlsHandshakeComplete() = 0;
39
40 // Called to discard old decryption keys to stop processing packets of
41 // encryption |level|.
42 virtual void DiscardOldDecryptionKey(EncryptionLevel level) = 0;
43
44 // Called to discard old encryption keys (and neuter obsolete data).
45 // TODO(fayang): consider to combine this with DiscardOldDecryptionKey.
46 virtual void DiscardOldEncryptionKey(EncryptionLevel level) = 0;
47
48 // Called to neuter ENCRYPTION_INITIAL data (without discarding initial keys).
49 virtual void NeuterUnencryptedData() = 0;
50
51 // Called to neuter data of HANDSHAKE_DATA packet number space. Only used in
52 // QUIC crypto. This is called 1) when a client switches to forward secure
53 // encryption level and 2) a server successfully processes a forward secure
54 // packet.
55 virtual void NeuterHandshakeData() = 0;
56
57 // Called when 0-RTT data is rejected by the server. This is only called in
58 // TLS handshakes and only called on clients.
59 virtual void OnZeroRttRejected(int reason) = 0;
60
61 // Fills in |params| with values from the delegate's QuicConfig.
62 // Returns whether the operation succeeded.
63 virtual bool FillTransportParameters(TransportParameters* params) = 0;
64
65 // Read |params| and apply the values to the delegate's QuicConfig.
66 // On failure, returns a QuicErrorCode and saves a detailed error in
67 // |error_details|.
68 virtual QuicErrorCode ProcessTransportParameters(
69 const TransportParameters& params, bool is_resumption,
70 std::string* error_details) = 0;
71
72 // Called at the end of an handshake operation callback.
73 virtual void OnHandshakeCallbackDone() = 0;
74
75 // Whether a packet flusher is currently attached.
76 virtual bool PacketFlusherAttached() const = 0;
77
78 // Get the QUIC version currently in use. tls_handshaker needs this to pass
79 // to crypto_utils to apply version-dependent HKDF labels.
80 virtual ParsedQuicVersion parsed_version() const = 0;
81};
82
83} // namespace quic
84
85#endif // QUICHE_QUIC_CORE_HANDSHAKER_DELEGATE_INTERFACE_H_