// Copyright 2018 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_HKDF_H_
#define QUICHE_QUIC_CORE_CRYPTO_QUIC_HKDF_H_

#include <vector>

#include "absl/strings/string_view.h"
#include "quic/platform/api/quic_export.h"

namespace quic {

// QuicHKDF implements the key derivation function specified in RFC 5869
// (using SHA-256) and outputs key material, as needed by QUIC.
// See https://tools.ietf.org/html/rfc5869 for details.
class QUIC_EXPORT_PRIVATE QuicHKDF {
 public:
  // |secret|: the input shared secret (or, from RFC 5869, the IKM).
  // |salt|: an (optional) public salt / non-secret random value. While
  // optional, callers are strongly recommended to provide a salt. There is no
  // added security value in making this larger than the SHA-256 block size of
  // 64 bytes.
  // |info|: an (optional) label to distinguish different uses of HKDF. It is
  // optional context and application specific information (can be a zero-length
  // string).
  // |key_bytes_to_generate|: the number of bytes of key material to generate
  // for both client and server.
  // |iv_bytes_to_generate|: the number of bytes of IV to generate for both
  // client and server.
  // |subkey_secret_bytes_to_generate|: the number of bytes of subkey secret to
  // generate, shared between client and server.
  QuicHKDF(absl::string_view secret,
           absl::string_view salt,
           absl::string_view info,
           size_t key_bytes_to_generate,
           size_t iv_bytes_to_generate,
           size_t subkey_secret_bytes_to_generate);

  // An alternative constructor that allows the client and server key/IV
  // lengths to be different.
  QuicHKDF(absl::string_view secret,
           absl::string_view salt,
           absl::string_view info,
           size_t client_key_bytes_to_generate,
           size_t server_key_bytes_to_generate,
           size_t client_iv_bytes_to_generate,
           size_t server_iv_bytes_to_generate,
           size_t subkey_secret_bytes_to_generate);

  ~QuicHKDF();

  absl::string_view client_write_key() const { return client_write_key_; }
  absl::string_view client_write_iv() const { return client_write_iv_; }
  absl::string_view server_write_key() const { return server_write_key_; }
  absl::string_view server_write_iv() const { return server_write_iv_; }
  absl::string_view subkey_secret() const { return subkey_secret_; }
  absl::string_view client_hp_key() const { return client_hp_key_; }
  absl::string_view server_hp_key() const { return server_hp_key_; }

 private:
  std::vector<uint8_t> output_;

  absl::string_view client_write_key_;
  absl::string_view server_write_key_;
  absl::string_view client_write_iv_;
  absl::string_view server_write_iv_;
  absl::string_view subkey_secret_;
  absl::string_view client_hp_key_;
  absl::string_view server_hp_key_;
};

}  // namespace quic

#endif  // QUICHE_QUIC_CORE_CRYPTO_QUIC_HKDF_H_
