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-2006
8 *
9 */
10
11
12 #include <stdlib.h>
13 #include <stdio.h>
14 #include <string.h>
15 #include <unistd.h>
16 #include <sys/types.h>
17 #include <sys/stat.h>
18 #include <sys/mman.h>
19 #include <fcntl.h>
20 #include <errno.h>
21
22 #include "trousers/tss.h"
23 #include "trousers_types.h"
24 #include "trousers_types.h"
25 #include "tcs_tsp.h"
26 #include "tcs_utils.h"
27 #include "tcs_int_literals.h"
28 #include "tcsps.h"
29 #include "tcslog.h"
30 #include "tcsd_wrap.h"
31 #include "tcsd.h"
32 #include "tcs_aik.h"
33
34 void
LoadBlob_SYMMETRIC_KEY(UINT64 * offset,BYTE * blob,TCPA_SYMMETRIC_KEY * key)35 LoadBlob_SYMMETRIC_KEY(UINT64 *offset, BYTE *blob, TCPA_SYMMETRIC_KEY *key)
36 {
37 LoadBlob_UINT32(offset, key->algId, blob);
38 LoadBlob_UINT16(offset, key->encScheme, blob);
39 LoadBlob_UINT16(offset, key->size, blob);
40
41 if (key->size > 0) {
42 LoadBlob(offset, key->size, blob, key->data);
43 } else {
44 key->data = NULL;
45 }
46 }
47
48 TSS_RESULT
UnloadBlob_SYMMETRIC_KEY(UINT64 * offset,BYTE * blob,TCPA_SYMMETRIC_KEY * key)49 UnloadBlob_SYMMETRIC_KEY(UINT64 *offset, BYTE *blob, TCPA_SYMMETRIC_KEY *key)
50 {
51 if (!key) {
52 UINT16 size;
53
54 UnloadBlob_UINT32(offset, NULL, blob);
55 UnloadBlob_UINT16(offset, NULL, blob);
56 UnloadBlob_UINT16(offset, &size, blob);
57
58 if (size > 0)
59 UnloadBlob(offset, size, blob, NULL);
60
61 return TSS_SUCCESS;
62 }
63
64 UnloadBlob_UINT32(offset, &key->algId, blob);
65 UnloadBlob_UINT16(offset, &key->encScheme, blob);
66 UnloadBlob_UINT16(offset, &key->size, blob);
67
68 if (key->size > 0) {
69 key->data = (BYTE *)malloc(key->size);
70 if (key->data == NULL) {
71 LogError("malloc of %hu bytes failed.", key->size);
72 key->size = 0;
73 return TCSERR(TSS_E_OUTOFMEMORY);
74 }
75 UnloadBlob(offset, key->size, blob, key->data);
76 } else {
77 key->data = NULL;
78 }
79
80 return TSS_SUCCESS;
81 }
82
83 void
get_credential(UINT32 type,UINT32 * size,BYTE ** cred)84 get_credential(UINT32 type, UINT32 *size, BYTE **cred)
85 {
86 int rc, fd;
87 char *path = NULL;
88 void *file = NULL;
89 struct stat stat_buf;
90 size_t file_size;
91
92 switch (type) {
93 case TSS_TCS_CREDENTIAL_PLATFORMCERT:
94 path = tcsd_options.platform_cred;
95 break;
96 case TSS_TCS_CREDENTIAL_TPM_CC:
97 path = tcsd_options.conformance_cred;
98 break;
99 case TSS_TCS_CREDENTIAL_EKCERT:
100 path = tcsd_options.endorsement_cred;
101 break;
102 default:
103 LogDebugFn("Bad credential type");
104 break;
105 }
106
107 if (path == NULL)
108 goto done;
109
110 if ((fd = open(path, O_RDONLY)) < 0) {
111 LogError("open(%s): %s", path, strerror(errno));
112 goto done;
113 }
114
115 if ((rc = fstat(fd, &stat_buf)) == -1) {
116 LogError("Error stating credential: %s: %s", path, strerror(errno));
117 close(fd);
118 goto done;
119 }
120
121 file_size = (size_t)stat_buf.st_size;
122
123 LogDebugFn("%s, (%zd bytes)", path, file_size);
124
125 file = mmap(0, file_size, PROT_READ, MAP_PRIVATE, fd, 0);
126 if (file == MAP_FAILED) {
127 LogError("Error reading credential: %s: %s", path, strerror(errno));
128 close(fd);
129 goto done;
130 }
131 close(fd);
132
133 if ((*cred = malloc(file_size)) == NULL) {
134 LogError("malloc of %zd bytes failed.", file_size);
135 munmap(file, file_size);
136 goto done;
137 }
138
139 memcpy(*cred, file, file_size);
140 *size = file_size;
141 munmap(file, file_size);
142
143 return;
144 done:
145 *cred = NULL;
146 *size = 0;
147 }
148