/* Copyright (c) 2012 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 "sysincludes.h"

#include "tlcl.h"
#include "tlcl_internal.h"
#include "utility.h"
#include "vboot_api.h"

uint32_t TlclLibInit(void) {
  return VbExTpmInit();
}

uint32_t TlclLibClose(void) {
  return TPM_SUCCESS;
}

uint32_t TlclStartup(void) {
  return TPM_SUCCESS;
}

uint32_t TlclSaveState(void) {
  return TPM_SUCCESS;
}

uint32_t TlclResume(void) {
  return TPM_SUCCESS;
}

uint32_t TlclSelfTestFull(void) {
  return TPM_SUCCESS;
}

uint32_t TlclContinueSelfTest(void) {
  return TPM_SUCCESS;
}

uint32_t TlclDefineSpace(uint32_t index, uint32_t perm, uint32_t size) {
  return TPM_SUCCESS;
}

uint32_t TlclWrite(uint32_t index, const void* data, uint32_t length) {
  return TPM_SUCCESS;
}

uint32_t TlclRead(uint32_t index, void* data, uint32_t length) {
  Memset(data, '\0', length);
  return TPM_SUCCESS;
}

uint32_t TlclPCRRead(uint32_t index, void* data, uint32_t length) {
  Memset(data, '\0', length);
  return TPM_SUCCESS;
}

uint32_t TlclWriteLock(uint32_t index) {
  return TPM_SUCCESS;
}

uint32_t TlclReadLock(uint32_t index) {
  return TPM_SUCCESS;
}

uint32_t TlclAssertPhysicalPresence(void) {
  return TPM_SUCCESS;
}

uint32_t TlclPhysicalPresenceCMDEnable(void) {
  return TPM_SUCCESS;
}

uint32_t TlclFinalizePhysicalPresence(void) {
  return TPM_SUCCESS;
}

uint32_t TlclAssertPhysicalPresenceResult(void) {
  return TPM_SUCCESS;
}

uint32_t TlclLockPhysicalPresence(void) {
  return TPM_SUCCESS;
}

uint32_t TlclSetNvLocked(void) {
  return TPM_SUCCESS;
}

int TlclIsOwned(void) {
  return 0;
}

uint32_t TlclForceClear(void) {
  return TPM_SUCCESS;
}

uint32_t TlclSetEnable(void) {
  return TPM_SUCCESS;
}

uint32_t TlclClearEnable(void) {
  return TPM_SUCCESS;
}

uint32_t TlclSetDeactivated(uint8_t flag) {
  return TPM_SUCCESS;
}

uint32_t TlclGetPermanentFlags(TPM_PERMANENT_FLAGS* pflags) {
  Memset(pflags, '\0', sizeof(*pflags));
  return TPM_SUCCESS;
}

uint32_t TlclGetSTClearFlags(TPM_STCLEAR_FLAGS* vflags) {
  Memset(vflags, '\0', sizeof(*vflags));
  return TPM_SUCCESS;
}

uint32_t TlclGetFlags(uint8_t* disable,
                      uint8_t* deactivated,
                      uint8_t *nvlocked) {
  *disable = 0;
  *deactivated = 0;
  *nvlocked = 0;
  return TPM_SUCCESS;
}

uint32_t TlclSetGlobalLock(void) {
  return TPM_SUCCESS;
}

uint32_t TlclExtend(int pcr_num, const uint8_t* in_digest,
                    uint8_t* out_digest) {
  Memcpy(out_digest, in_digest, kPcrDigestLength);
  return TPM_SUCCESS;
}

uint32_t TlclGetPermissions(uint32_t index, uint32_t* permissions) {
  *permissions = 0;
  return TPM_SUCCESS;
}

uint32_t TlclGetOwnership(uint8_t* owned) {
  *owned = 0;
  return TPM_SUCCESS;
}

uint32_t TlclGetRandom(uint8_t* data, uint32_t length, uint32_t *size) {
  *size = length;
  /* http://dilbert.com/strips/comic/2001-10-25/ */
  Memset(data, '\x9', *size);
  return TPM_SUCCESS;
}

int TlclPacketSize(const uint8_t* packet)
{
  uint32_t size;
  FromTpmUint32(packet + sizeof(uint16_t), &size);
  return (int) size;
}

uint32_t TlclSendReceive(const uint8_t* request, uint8_t* response,
                         int max_length)
{
  return TPM_SUCCESS;
}