// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// Fuzzer for HmacAuthorizationDelegate.

#include <stdint.h>
#include <string.h>
#include <string>
#include <vector>

#include <base/logging.h>
#include <fuzzer/FuzzedDataProvider.h>

#include "trunks/hmac_authorization_delegate.h"
#include "trunks/tpm_generated.h"

struct Environment {
  Environment() {
    logging::SetMinLogLevel(logging::LOG_FATAL);  // Disable logging.
  }
};

extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
  static Environment env;

  FuzzedDataProvider data_provider(data, size);
  trunks::HmacAuthorizationDelegate delegate;
  // This isn't used for anything aside from CHECK() for a nonzero value, so
  // don't fuzz it.
  constexpr int kSessionHandle = 1;
  // The nonce's need to be between 16 and 32 bytes (exclusive) or the init
  // will immediately fail, but we should still fuzz a range of lengths.
  constexpr int kNonceSizeMin = 0;
  constexpr int kNonceSizeMax = 64;
  trunks::TPM2B_NONCE tpm_nonce;
  trunks::TPM2B_NONCE caller_nonce;
  tpm_nonce.size =
      data_provider.ConsumeIntegralInRange(kNonceSizeMin, kNonceSizeMax);
  caller_nonce.size =
      data_provider.ConsumeIntegralInRange(kNonceSizeMin, kNonceSizeMax);
  if (tpm_nonce.size) {
    std::vector<uint8_t> rand_data =
        data_provider.ConsumeBytes<uint8_t>(tpm_nonce.size);
    // Backfill with zeroes in case the data provider ran out of stream.
    rand_data.resize(tpm_nonce.size);
    memcpy(tpm_nonce.buffer, rand_data.data(), rand_data.size());
  }
  if (caller_nonce.size) {
    std::vector<uint8_t> rand_data =
        data_provider.ConsumeBytes<uint8_t>(caller_nonce.size);
    // Backfill with zeroes in case the data provider ran out of stream.
    rand_data.resize(caller_nonce.size);
    memcpy(caller_nonce.buffer, rand_data.data(), rand_data.size());
  }
  constexpr int kMaxRandomStringLength = 128;
  delegate.InitSession(
      kSessionHandle, tpm_nonce, caller_nonce,
      data_provider.ConsumeRandomLengthString(kMaxRandomStringLength),
      data_provider.ConsumeRandomLengthString(kMaxRandomStringLength),
      data_provider.ConsumeBool());

  // Randomly decide to get the command auth or check the response auth.
  if (data_provider.ConsumeBool()) {
    std::string auth;
    delegate.GetCommandAuthorization(
        data_provider.ConsumeRandomLengthString(kMaxRandomStringLength),
        data_provider.ConsumeBool(), data_provider.ConsumeBool(), &auth);
  } else {
    delegate.CheckResponseAuthorization(
        data_provider.ConsumeRandomLengthString(kMaxRandomStringLength),
        data_provider.ConsumeRandomLengthString(kMaxRandomStringLength));
  }
  return 0;
}
