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

#include "quic/core/crypto/null_encrypter.h"

#include "absl/numeric/int128.h"
#include "absl/strings/string_view.h"
#include "quic/core/quic_data_writer.h"
#include "quic/core/quic_utils.h"

namespace quic {

const size_t kHashSizeShort = 12;  // size of uint128 serialized short

NullEncrypter::NullEncrypter(Perspective perspective)
    : perspective_(perspective) {}

bool NullEncrypter::SetKey(absl::string_view key) {
  return key.empty();
}

bool NullEncrypter::SetNoncePrefix(absl::string_view nonce_prefix) {
  return nonce_prefix.empty();
}

bool NullEncrypter::SetIV(absl::string_view iv) {
  return iv.empty();
}

bool NullEncrypter::SetHeaderProtectionKey(absl::string_view key) {
  return key.empty();
}

bool NullEncrypter::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) {
  const size_t len = plaintext.size() + GetHashLength();
  if (max_output_length < len) {
    return false;
  }
  absl::uint128 hash;
  if (perspective_ == Perspective::IS_SERVER) {
    hash =
        QuicUtils::FNV1a_128_Hash_Three(associated_data, plaintext, "Server");
  } else {
    hash =
        QuicUtils::FNV1a_128_Hash_Three(associated_data, plaintext, "Client");
  }
  // TODO(ianswett): memmove required for in place encryption.  Placing the
  // hash at the end would allow use of memcpy, doing nothing for in place.
  memmove(output + GetHashLength(), plaintext.data(), plaintext.length());
  QuicUtils::SerializeUint128Short(hash,
                                   reinterpret_cast<unsigned char*>(output));
  *output_length = len;
  return true;
}

std::string NullEncrypter::GenerateHeaderProtectionMask(
    absl::string_view /*sample*/) {
  return std::string(5, 0);
}

size_t NullEncrypter::GetKeySize() const {
  return 0;
}

size_t NullEncrypter::GetNoncePrefixSize() const {
  return 0;
}

size_t NullEncrypter::GetIVSize() const {
  return 0;
}

size_t NullEncrypter::GetMaxPlaintextSize(size_t ciphertext_size) const {
  return ciphertext_size - std::min(ciphertext_size, GetHashLength());
}

size_t NullEncrypter::GetCiphertextSize(size_t plaintext_size) const {
  return plaintext_size + GetHashLength();
}

QuicPacketCount NullEncrypter::GetConfidentialityLimit() const {
  return std::numeric_limits<QuicPacketCount>::max();
}

absl::string_view NullEncrypter::GetKey() const {
  return absl::string_view();
}

absl::string_view NullEncrypter::GetNoncePrefix() const {
  return absl::string_view();
}

size_t NullEncrypter::GetHashLength() const {
  return kHashSizeShort;
}

}  // namespace quic
