|  | // Copyright (c) 2012 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_CRYPTO_QUIC_ENCRYPTER_H_ | 
|  | #define QUICHE_QUIC_CORE_CRYPTO_QUIC_ENCRYPTER_H_ | 
|  |  | 
|  | #include <cstddef> | 
|  | #include <memory> | 
|  |  | 
|  | #include "absl/strings/string_view.h" | 
|  | #include "quic/core/crypto/quic_crypter.h" | 
|  | #include "quic/core/quic_packets.h" | 
|  | #include "quic/platform/api/quic_export.h" | 
|  |  | 
|  | namespace quic { | 
|  |  | 
|  | class QUIC_EXPORT_PRIVATE QuicEncrypter : public QuicCrypter { | 
|  | public: | 
|  | virtual ~QuicEncrypter() {} | 
|  |  | 
|  | static std::unique_ptr<QuicEncrypter> Create(const ParsedQuicVersion& version, | 
|  | QuicTag algorithm); | 
|  |  | 
|  | // Creates an IETF QuicEncrypter based on |cipher_suite| which must be an id | 
|  | // returned by SSL_CIPHER_get_id. The caller is responsible for taking | 
|  | // ownership of the new QuicEncrypter. | 
|  | static std::unique_ptr<QuicEncrypter> CreateFromCipherSuite( | 
|  | uint32_t cipher_suite); | 
|  |  | 
|  | // Writes encrypted |plaintext| and a MAC over |plaintext| and | 
|  | // |associated_data| into output. Sets |output_length| to the number of | 
|  | // bytes written. Returns true on success or false if there was an error. | 
|  | // |packet_number| is appended to the |nonce_prefix| value provided in | 
|  | // SetNoncePrefix() to form the nonce. |output| must not overlap with | 
|  | // |associated_data|. If |output| overlaps with |plaintext| then | 
|  | // |plaintext| must be <= |output|. | 
|  | virtual bool EncryptPacket(uint64_t packet_number, | 
|  | absl::string_view associated_data, | 
|  | absl::string_view plaintext, | 
|  | char* output, | 
|  | size_t* output_length, | 
|  | size_t max_output_length) = 0; | 
|  |  | 
|  | // Takes a |sample| of ciphertext and uses the header protection key to | 
|  | // generate a mask to use for header protection, and returns that mask. On | 
|  | // success, the mask will be at least 5 bytes long; on failure the string will | 
|  | // be empty. | 
|  | virtual std::string GenerateHeaderProtectionMask( | 
|  | absl::string_view sample) = 0; | 
|  |  | 
|  | // Returns the maximum length of plaintext that can be encrypted | 
|  | // to ciphertext no larger than |ciphertext_size|. | 
|  | virtual size_t GetMaxPlaintextSize(size_t ciphertext_size) const = 0; | 
|  |  | 
|  | // Returns the length of the ciphertext that would be generated by encrypting | 
|  | // to plaintext of size |plaintext_size|. | 
|  | virtual size_t GetCiphertextSize(size_t plaintext_size) const = 0; | 
|  |  | 
|  | // Returns the maximum number of packets that can be safely encrypted with | 
|  | // this encrypter. | 
|  | virtual QuicPacketCount GetConfidentialityLimit() const = 0; | 
|  |  | 
|  | // For use by unit tests only. | 
|  | virtual absl::string_view GetKey() const = 0; | 
|  | virtual absl::string_view GetNoncePrefix() const = 0; | 
|  | }; | 
|  |  | 
|  | }  // namespace quic | 
|  |  | 
|  | #endif  // QUICHE_QUIC_CORE_CRYPTO_QUIC_ENCRYPTER_H_ |