xref: /netbsd-src/crypto/external/cpl/trousers/dist/src/tcs/tcs_aik.c (revision 1023804e3833a0bd94414f2545512128f6502c74)
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