blob: 75554180683e34e216db4b7f8825949a49823174 [file] [log] [blame]
/* Software-Based Trusted Platform Module (TPM) Emulator for Linux
* Copyright (C) 2010 Google, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published
* by the Free Software Foundation; either version 2 of the License,
* or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* $Id$
*/
#include "tpmemu.h"
/* Gets all the extra functions we need and gets rid of duplicate "main".
*
* TODO: this is the simplest change that achieves this functionality.
* I am sending it back to Mario to have it integrated better.
*/
#define main very_sorry_about_this
#include "tpmd.c"
#include <tss/tcs.h>
void tpmemu_execute(uint8_t *in, uint32_t in_len,
uint8_t *out, uint32_t *pout_len)
{
if (in_len <= 0) {
error("invalid command length (%d)", in_len);
} else {
uint8_t *result = NULL;
uint32_t result_len;
int res;
res = tpm_handle_command(in, in_len, &result, &result_len);
if (res < 0) {
error("tpm_handle_command() failed");
} else {
debug("received %d bytes", result_len);
if (result_len >= *pout_len) {
error("tpm result too large for output buffer");
} else {
*pout_len = result_len;
memmove(out, result, result_len);
}
tpm_free(result);
}
}
}
void tpmemu_init(void)
{
info("initializing TPM Emulator (1.2.%d.%d)", VERSION_MAJOR, VERSION_MINOR);
init_random();
mkdirs(opt_storage_file);
debug("initializing TPM emulator: %d", tpm_startup);
tpm_emulator_init(TPM_ST_CLEAR, 0);
}