// Copyright 2018 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.
//
// FuzzedCommanTransceiver is a test transceiver for fuzzing TPM commands and
// responses.

#ifndef TRUNKS_FUZZED_COMMAND_TRANSCEIVER_H_
#define TRUNKS_FUZZED_COMMAND_TRANSCEIVER_H_

#include <cstdint>
#include <fuzzer/FuzzedDataProvider.h>
#include <string>

#include <base/macros.h>

#include "trunks/command_transceiver.h"

namespace trunks {

// Provides responses based on random data consumed from FuzzedDataProvider.
class FuzzedCommandTransceiver : public CommandTransceiver {
 public:
  FuzzedCommandTransceiver(FuzzedDataProvider* const data_provider,
                           size_t max_message_size);

  // CommandTransceiver methods.
  void SendCommand(const std::string& command,
                   const ResponseCallback& callback) override;
  std::string SendCommandAndWait(const std::string& command) override;

  // Builds a fuzzed TPM command.
  std::string ConsumeCommand();

  // Builds a fuzzed response to the provided command.
  std::string ConsumeResponseForCommand(const std::string& command);

  // Returns a realistic fuzzed command code.
  uint32_t ConsumeCommandCode();

  // Returns a realistic fuzzed response code.
  uint32_t ConsumeResponseCode();

  // Returns a realistic fuzzed command tag.
  uint16_t ConsumeCommandTag();

  // Returns fuzzed area with |qnt_handles| handles.
  std::string ConsumeHandles(size_t qnt_handles);

  // Returns fuzzed TPM handle.
  uint32_t ConsumeHandle();

  // Returns fuzzed payload for the message with header and handles area
  // taking |pre_payload_size| bytes.
  std::string ConsumePayload(size_t pre_payload_size);

 private:
  // Returns fuzzed bool, which is true with probability |probability| %.
  bool ConsumeBoolWithProbability(uint32_t probability);

  // Returns a random fuzzed message.
  std::string ConsumeRandomMessage();

  // Returns a random uint32_t.
  uint32_t ConsumeUint32();

  FuzzedDataProvider* const data_provider_;
  const size_t max_message_size_;

  DISALLOW_COPY_AND_ASSIGN(FuzzedCommandTransceiver);
};

}  // namespace trunks

#endif  // TRUNKS_FUZZED_COMMAND_TRANSCEIVER_H_
