1
2 /*
3 * Licensed Materials - Property of IBM
4 *
5 * trousers - An open source TCG Software Stack
6 *
7 * (C) Copyright International Business Machines Corp. 2004-2007
8 *
9 */
10
11
12 #include <stdlib.h>
13 #include <stdio.h>
14 #include <string.h>
15
16 #include "trousers/tss.h"
17 #include "trousers/trousers.h"
18 #include "trousers_types.h"
19 #include "spi_utils.h"
20 #include "capabilities.h"
21 #include "tsplog.h"
22 #include "obj.h"
23
24
25 /* encrypt some data with the RSA public key of 'key', using the padding appropriate for the key */
26 TSS_RESULT
__tspi_rsa_encrypt(TSS_HKEY key,UINT32 inDataLen,BYTE * inData,UINT32 * outDataLen,BYTE * outData)27 __tspi_rsa_encrypt(TSS_HKEY key,
28 UINT32 inDataLen,
29 BYTE* inData,
30 UINT32* outDataLen,
31 BYTE* outData)
32 {
33 BYTE *blob;
34 UINT32 blobLen;
35 UINT64 offset;
36 TSS_RESULT result;
37 TSS_HCONTEXT tspContext;
38 TPM_PUBKEY pubKey;
39
40 if (!inData || !outDataLen || !outData)
41 return TSPERR(TSS_E_INTERNAL_ERROR);
42
43 if ((result = obj_rsakey_get_tsp_context(key, &tspContext)))
44 return result;
45
46 if ((result = obj_rsakey_get_pub_blob(key, &blobLen, &blob)))
47 return result;
48
49 offset = 0;
50 if ((result = Trspi_UnloadBlob_PUBKEY(&offset, blob, &pubKey))) {
51 free_tspi(tspContext, blob);
52 return result;
53 }
54 free_tspi(tspContext, blob);
55
56 if (pubKey.pubKey.keyLength < inDataLen) {
57 result = TSPERR(TSS_E_ENC_INVALID_LENGTH);
58 goto done;
59 }
60
61 if (pubKey.algorithmParms.encScheme == TPM_ES_RSAESPKCSv15 ||
62 pubKey.algorithmParms.encScheme == TSS_ES_RSAESPKCSV15) {
63 if ((result = Trspi_RSA_PKCS15_Encrypt(inData, inDataLen, outData, outDataLen,
64 pubKey.pubKey.key, pubKey.pubKey.keyLength)))
65 goto done;
66 } else {
67 if ((result = Trspi_TPM_RSA_OAEP_Encrypt(inData, inDataLen, outData, outDataLen,
68 pubKey.pubKey.key,
69 pubKey.pubKey.keyLength)))
70 goto done;
71 }
72
73 done:
74 free(pubKey.pubKey.key);
75 free(pubKey.algorithmParms.parms);
76 return result;
77 }
78
79 TSS_RESULT
__tspi_rsa_verify(TSS_HKEY key,UINT32 type,UINT32 hashLen,BYTE * hash,UINT32 sigLen,BYTE * sig)80 __tspi_rsa_verify(TSS_HKEY key,
81 UINT32 type,
82 UINT32 hashLen,
83 BYTE* hash,
84 UINT32 sigLen,
85 BYTE* sig)
86 {
87 BYTE *blob;
88 UINT32 blobLen;
89 UINT64 offset;
90 TSS_RESULT result;
91 TSS_HCONTEXT tspContext;
92 TPM_PUBKEY pubKey;
93
94 if (!hash || !sig)
95 return TSPERR(TSS_E_INTERNAL_ERROR);
96
97 if ((result = obj_rsakey_get_tsp_context(key, &tspContext)))
98 return result;
99
100 if ((result = obj_rsakey_get_pub_blob(key, &blobLen, &blob)))
101 return result;
102
103 offset = 0;
104 if ((result = Trspi_UnloadBlob_PUBKEY(&offset, blob, &pubKey))) {
105 free_tspi(tspContext, blob);
106 return result;
107 }
108 free_tspi(tspContext, blob);
109
110 result = Trspi_Verify(type, hash, hashLen, pubKey.pubKey.key, pubKey.pubKey.keyLength,
111 sig, sigLen);
112
113 free(pubKey.pubKey.key);
114 free(pubKey.algorithmParms.parms);
115
116 return result;
117 }
118