| |
| /* |
| * Licensed Materials - Property of IBM |
| * |
| * trousers - An open source TCG Software Stack |
| * |
| * (C) Copyright International Business Machines Corp. 2004-2006 |
| * |
| */ |
| |
| |
| #include <stdlib.h> |
| #include <stdio.h> |
| #include <syslog.h> |
| #include <signal.h> |
| #include <string.h> |
| #include <errno.h> |
| #include <unistd.h> |
| |
| #include "trousers/tss.h" |
| #include "tcs_tsp.h" |
| #include "tcs_utils.h" |
| #include "tddl.h" |
| #include "req_mgr.h" |
| #include "tcslog.h" |
| |
| static struct tpm_req_mgr *trm; |
| |
| #ifdef TSS_DEBUG |
| #define TSS_TPM_DEBUG |
| #endif |
| |
| TSS_RESULT |
| req_mgr_submit_req(BYTE *blob) |
| { |
| TSS_RESULT result; |
| BYTE loc_buf[TSS_TPM_TXBLOB_SIZE]; |
| UINT32 size = TSS_TPM_TXBLOB_SIZE; |
| UINT32 retry = TSS_REQ_MGR_MAX_RETRIES; |
| |
| MUTEX_LOCK(trm->queue_lock); |
| |
| #ifdef TSS_TPM_DEBUG |
| LogBlobData("To TPM:", Decode_UINT32(&blob[2]), blob); |
| #endif |
| |
| do { |
| result = Tddli_TransmitData(blob, Decode_UINT32(&blob[2]), loc_buf, &size); |
| } while (!result && (Decode_UINT32(&loc_buf[6]) == TCPA_E_RETRY) && --retry); |
| |
| if (!result) |
| memcpy(blob, loc_buf, Decode_UINT32(&loc_buf[2])); |
| |
| #ifdef TSS_TPM_DEBUG |
| LogBlobData("From TPM:", size, loc_buf); |
| #endif |
| |
| MUTEX_UNLOCK(trm->queue_lock); |
| |
| return result; |
| } |
| |
| TSS_RESULT |
| req_mgr_init() |
| { |
| if ((trm = calloc(1, sizeof(struct tpm_req_mgr))) == NULL) { |
| LogError("malloc of %zd bytes failed.", sizeof(struct tpm_req_mgr)); |
| return TSS_E_OUTOFMEMORY; |
| } |
| |
| MUTEX_INIT(trm->queue_lock); |
| |
| return Tddli_Open(); |
| } |
| |
| TSS_RESULT |
| req_mgr_final() |
| { |
| free(trm); |
| |
| return Tddli_Close(); |
| } |
| |