/* 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 "2sysincludes.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 TlclDefineSpaceEx(const uint8_t* owner_auth, uint32_t owner_auth_size,
			   uint32_t index, uint32_t perm, uint32_t size,
			   const void* auth_policy, uint32_t auth_policy_size)
{
	return TPM_SUCCESS;
}

#ifdef CHROMEOS_ENVIRONMENT

uint32_t TlclUndefineSpace(uint32_t index)
{
	return TPM_SUCCESS;
}

#endif  /* CHROMEOS_ENVIRONMENT */

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;
}

uint32_t TlclGetVersion(uint32_t* vendor, uint64_t* firmware_version,
			uint8_t* vendor_specific_buf,
			size_t* vendor_specific_buf_size)
{
	*vendor = 0x4e4f4e45;
	*firmware_version = 0x1;
	if (vendor_specific_buf_size) {
		*vendor_specific_buf_size = 0;
	}
	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;
}

uint32_t TlclIFXFieldUpgradeInfo(TPM_IFX_FIELDUPGRADEINFO* info)
{
	memset(info, 0, sizeof(*info));
	return TPM_SUCCESS;
}
