| // Copyright 2020 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_TOOLS_SIMPLE_TICKET_CRYPTER_H_ | |
| #define QUICHE_QUIC_TOOLS_SIMPLE_TICKET_CRYPTER_H_ | |
| #include "third_party/boringssl/src/include/openssl/aead.h" | |
| #include "quic/core/crypto/proof_source.h" | |
| #include "quic/core/quic_clock.h" | |
| #include "quic/core/quic_time.h" | |
| namespace quic { | |
| // SimpleTicketCrypter implements the QUIC ProofSource::TicketCrypter interface. | |
| // It generates a random key at startup and every 7 days it rotates the key, | |
| // keeping track of the previous key used to facilitate decrypting older | |
| // tickets. This implementation is not suitable for server setups where multiple | |
| // servers need to share keys. | |
| class QUIC_NO_EXPORT SimpleTicketCrypter | |
| : public quic::ProofSource::TicketCrypter { | |
| public: | |
| explicit SimpleTicketCrypter(QuicClock* clock); | |
| ~SimpleTicketCrypter() override; | |
| size_t MaxOverhead() override; | |
| std::vector<uint8_t> Encrypt(absl::string_view in, | |
| absl::string_view encryption_key) override; | |
| void Decrypt( | |
| absl::string_view in, | |
| std::unique_ptr<quic::ProofSource::DecryptCallback> callback) override; | |
| private: | |
| std::vector<uint8_t> Decrypt(absl::string_view in); | |
| void MaybeRotateKeys(); | |
| static constexpr size_t kKeySize = 16; | |
| struct Key { | |
| uint8_t key[kKeySize]; | |
| bssl::ScopedEVP_AEAD_CTX aead_ctx; | |
| QuicTime expiration = QuicTime::Zero(); | |
| }; | |
| std::unique_ptr<Key> NewKey(); | |
| std::unique_ptr<Key> current_key_; | |
| std::unique_ptr<Key> previous_key_; | |
| uint8_t key_epoch_ = 0; | |
| QuicClock* clock_; | |
| }; | |
| } // namespace quic | |
| #endif // QUICHE_QUIC_TOOLS_SIMPLE_TICKET_CRYPTER_H_ |