Index: create_tpm_key.c =================================================================== RCS file: /cvsroot/trousers/applications/openssl_tpm_engine/create_tpm_key.c,v retrieving revision 1.9 diff -u -p -r1.9 create_tpm_key.c --- create_tpm_key.c 21 Dec 2007 18:10:11 -0000 1.9 +++ create_tpm_key.c 30 Sep 2008 13:26:05 -0000 @@ -141,7 +141,10 @@ int main(int argc, char **argv) TSS_HPOLICY srkUsagePolicy, keyUsagePolicy; BYTE *blob; UINT32 blob_size, srk_authusage; - FILE *out; + BIO *outb; + ASN1_OCTET_STRING *blob_str; + unsigned char *blob_asn1 = NULL; + int asn1_len; char *filename, c, *openssl_key = NULL; int option_index, auth = 0, popup = 0, wrap = 0; UINT32 enc_scheme = TSS_ES_RSAESPKCSV15; @@ -468,22 +471,25 @@ int main(int argc, char **argv) exit(result); } - if ((out = fopen(filename, "w")) == NULL) { - print_error("fopen", errno); + if ((outb = BIO_new_file(filename, "w")) == NULL) { + fprintf(stderr, "Error opening file for write: %s\n", filename); Tspi_Context_CloseObject(hContext, hKey); Tspi_Context_Close(hContext); - exit(result); + exit(-1); } - - if (fwrite(blob, blob_size, 1, out) != 1) { - print_error("fwrite", errno); + blob_str = ASN1_OCTET_STRING_new(); + if (!blob_str) { + fprintf(stderr, "Error allocating ASN1_OCTET_STRING\n"); Tspi_Context_CloseObject(hContext, hKey); Tspi_Context_Close(hContext); - fclose(out); - exit(result); - } + exit(-1); + } + + ASN1_STRING_set(blob_str, blob, blob_size); + asn1_len = i2d_ASN1_OCTET_STRING(blob_str, &blob_asn1); + PEM_write_bio(outb, "TSS KEY BLOB", "", blob_asn1, asn1_len); - fclose(out); + BIO_free(outb); Tspi_Context_Close(hContext); printf("Success.\n"); Index: e_tpm.c =================================================================== RCS file: /cvsroot/trousers/applications/openssl_tpm_engine/e_tpm.c,v retrieving revision 1.17 diff -u -p -r1.17 e_tpm.c --- e_tpm.c 7 Dec 2007 21:55:57 -0000 1.17 +++ e_tpm.c 30 Sep 2008 13:26:06 -0000 @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -607,14 +608,13 @@ int fill_out_rsa_object(RSA *rsa, TSS_HK static EVP_PKEY *tpm_engine_load_key(ENGINE *e, const char *key_id, UI_METHOD *ui, void *cb_data) { + ASN1_OCTET_STRING *blobstr; TSS_HKEY hKey; TSS_RESULT result; - BYTE blob_buf[4096]; UINT32 authusage; RSA *rsa; EVP_PKEY *pkey; BIO *bf; - int rc; DBG("%s", __FUNCTION__); @@ -634,24 +634,26 @@ static EVP_PKEY *tpm_engine_load_key(ENG TPM_R_FILE_NOT_FOUND); return NULL; } -retry: - if ((rc = BIO_read(bf, &blob_buf[0], 4096)) < 0) { + + blobstr = PEM_ASN1_read_bio((void *)d2i_ASN1_OCTET_STRING, + "TSS KEY BLOB", bf, NULL, NULL, NULL); + if (!blobstr) { TSSerr(TPM_F_TPM_ENGINE_LOAD_KEY, TPM_R_FILE_READ_FAILED); BIO_free(bf); return NULL; - } else if (rc == 0 && BIO_should_retry(bf)) { - goto retry; } BIO_free(bf); - DBG("Loading blob of size: %d", rc); - if ((result = p_tspi_Context_LoadKeyByBlob(hContext, hSRK, rc, - blob_buf, &hKey))) { + DBG("Loading blob of size: %d", blobstr->length); + if ((result = p_tspi_Context_LoadKeyByBlob(hContext, hSRK, + blobstr->length, + blobstr->data, &hKey))) { TSSerr(TPM_F_TPM_ENGINE_LOAD_KEY, TPM_R_REQUEST_FAILED); return NULL; } + ASN1_OCTET_STRING_free(blobstr); if ((result = p_tspi_GetAttribUint32(hKey, TSS_TSPATTRIB_KEY_INFO, TSS_TSPATTRIB_KEYINFO_AUTHUSAGE,