// 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_
