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

#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>

#include <chromeos/streams/file_stream.h>

extern "C" {
#include <tpm2/_TPM_Init_fp.h>
#include <tpm2/ExecCommand_fp.h>
#include <tpm2/GetCommandCodeString_fp.h>
#include <tpm2/Platform.h>
#include <tpm2/tpm_generated.h>
}

int main() {
  // Initialize TPM.
  _plat__Signal_PowerOn();
  _TPM_Init();
  _plat__SetNvAvail();
  chromeos::ErrorPtr error;
  // Create pipes.
  mkfifo("/dev/tpm-req", O_CREAT|O_RDWR);
  mkfifo("/dev/tpm-resp", O_CREAT|O_RDWR);
  chromeos::StreamPtr request_stream = chromeos::FileStream::Open(
      base::FilePath("/dev/tpm-req"),
      chromeos::Stream::AccessMode::READ_WRITE,
      chromeos::FileStream::Disposition::CREATE_ALWAYS,
      &error);
  if (error.get()) {
    PLOG(ERROR) << "TPM simulator: Error opening /dev/tpm-req: "
                << error->GetMessage();
    return -1;
  }
  chromeos::StreamPtr response_stream = chromeos::FileStream::Open(
      base::FilePath("/dev/tpm-resp"),
      chromeos::Stream::AccessMode::READ_WRITE,
      chromeos::FileStream::Disposition::CREATE_ALWAYS,
      &error);
  if (error.get()) {
    PLOG(ERROR) << "TPM simulator: Error opening /dev/tpm-resp: "
                << error->GetMessage();
    return -1;
  }
  while (true) {
    unsigned char request[MAX_COMMAND_SIZE];
    unsigned int request_size;
    // Read request header.
    request_stream->ReadAllBlocking(request, 10, &error);
    if (error.get()) {
      PLOG(ERROR) << "TPM simulator: Error receiving request header: "
                  << error->GetMessage();
      return -1;
    }
    unsigned char *header = request;
    INT32 header_size = 10;
    TPMI_ST_COMMAND_TAG tag;
    UINT32 command_size;
    TPM_CC command_code;
    // Unmarshal request header to get request size and command code.
    TPM_RC rc = TPMI_ST_COMMAND_TAG_Unmarshal(&tag, &header, &header_size);
    CHECK_EQ(rc, TPM_RC_SUCCESS);
    rc = UINT32_Unmarshal(&command_size, &header, &header_size);
    CHECK_EQ(rc, TPM_RC_SUCCESS);
    rc = TPM_CC_Unmarshal(&command_code, &header, &header_size);
    CHECK_EQ(rc, TPM_RC_SUCCESS);
    request_size = command_size;
    // Read request body.
    if (request_size > 10) {
      request_stream->ReadAllBlocking(request+10, request_size-10, &error);
      if (error.get()) {
        PLOG(ERROR) << "TPM simulator: Error receiving request body: "
                    << error->GetMessage();
        return -1;
      }
    }
    // Execute command.
    LOG(INFO) << "TPM simulator: Executing "
              << GetCommandCodeString(command_code);
    unsigned int response_size;
    unsigned char *response;
    ExecuteCommand(request_size, request, &response_size, &response);
    // Write response.
    response_stream->WriteAllBlocking(response, response_size, &error);
    if (error.get()) {
      PLOG(ERROR) << "TPM simulator: Error writing response: "
                  << error->GetMessage();
      return -1;
    }
  }
}
