xref: /netbsd-src/crypto/external/cpl/trousers/dist/src/tspi/tsp_caps.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/mman.h>
18 #include <errno.h>
19 
20 #include "trousers/tss.h"
21 #include "trousers/trousers.h"
22 #include "trousers_types.h"
23 #include "trousers_types.h"
24 #include "spi_utils.h"
25 #include "capabilities.h"
26 #include "tsplog.h"
27 #include "obj.h"
28 
29 
30 TSS_RESULT
internal_GetCap(TSS_HCONTEXT tspContext,TSS_FLAG capArea,UINT32 subCap,UINT32 * respSize,BYTE ** respData)31 internal_GetCap(TSS_HCONTEXT tspContext, TSS_FLAG capArea, UINT32 subCap,
32 		UINT32 * respSize, BYTE ** respData)
33 {
34 	UINT64 offset = 0;
35 	TSS_VERSION v = INTERNAL_CAP_VERSION;
36 	TSS_BOOL bValue = FALSE;
37 	UINT32 u32value = 0;
38 
39 	switch (capArea) {
40 	case TSS_TSPCAP_VERSION:
41 		if ((*respData = calloc_tspi(tspContext, sizeof(TSS_VERSION))) == NULL) {
42 			LogError("malloc of %zd bytes failed", sizeof(TSS_VERSION));
43 			return TSPERR(TSS_E_OUTOFMEMORY);
44 		}
45 
46 		Trspi_LoadBlob_TSS_VERSION(&offset, *respData, v);
47 		*respSize = offset;
48 		break;
49 	case TSS_TSPCAP_ALG:
50 		switch (subCap) {
51 		case TSS_ALG_RSA:
52 			*respSize = sizeof(TSS_BOOL);
53 			bValue = INTERNAL_CAP_TSP_ALG_RSA;
54 			break;
55 		case TSS_ALG_AES:
56 			*respSize = sizeof(TSS_BOOL);
57 			bValue = INTERNAL_CAP_TSP_ALG_AES;
58 			break;
59 		case TSS_ALG_SHA:
60 			*respSize = sizeof(TSS_BOOL);
61 			bValue = INTERNAL_CAP_TSP_ALG_SHA;
62 			break;
63 		case TSS_ALG_HMAC:
64 			*respSize = sizeof(TSS_BOOL);
65 			bValue = INTERNAL_CAP_TSP_ALG_HMAC;
66 			break;
67 		case TSS_ALG_DES:
68 			*respSize = sizeof(TSS_BOOL);
69 			bValue = INTERNAL_CAP_TSP_ALG_DES;
70 			break;
71 		case TSS_ALG_3DES:
72 			*respSize = sizeof(TSS_BOOL);
73 			bValue = INTERNAL_CAP_TSP_ALG_3DES;
74 			break;
75 		case TSS_ALG_DEFAULT:
76 			*respSize = sizeof(UINT32);
77 			u32value = INTERNAL_CAP_TSP_ALG_DEFAULT;
78 			break;
79 		case TSS_ALG_DEFAULT_SIZE:
80 			*respSize = sizeof(UINT32);
81 			u32value = INTERNAL_CAP_TSP_ALG_DEFAULT_SIZE;
82 			break;
83 		default:
84 			LogError("Unknown TSP subCap: %u", subCap);
85 			return TSPERR(TSS_E_BAD_PARAMETER);
86 		}
87 
88 		if ((*respData = calloc_tspi(tspContext, *respSize)) == NULL) {
89 			LogError("malloc of %u bytes failed", *respSize);
90 			return TSPERR(TSS_E_OUTOFMEMORY);
91 		}
92 
93 		if (*respSize == sizeof(TSS_BOOL))
94 			*(TSS_BOOL *)respData = bValue;
95 		else
96 			*(UINT32 *)respData = u32value;
97 		break;
98 	case TSS_TSPCAP_PERSSTORAGE:
99 		if ((*respData = calloc_tspi(tspContext, sizeof(TSS_BOOL))) == NULL) {
100 			LogError("malloc of %zd bytes failed", sizeof(TSS_BOOL));
101 			return TSPERR(TSS_E_OUTOFMEMORY);
102 		}
103 
104 		*respSize = sizeof(TSS_BOOL);
105 		(*respData)[0] = INTERNAL_CAP_TSP_PERSSTORAGE;
106 		break;
107 	case TSS_TSPCAP_RETURNVALUE_INFO:
108 		if (subCap != TSS_TSPCAP_PROP_RETURNVALUE_INFO)
109 			return TSPERR(TSS_E_BAD_PARAMETER);
110 
111 		if ((*respData = calloc_tspi(tspContext, sizeof(UINT32))) == NULL) {
112 			LogError("malloc of %zd bytes failed", sizeof(UINT32));
113 			return TSPERR(TSS_E_OUTOFMEMORY);
114 		}
115 
116 		*respSize = sizeof(UINT32);
117 		*(UINT32 *)(*respData) = INTERNAL_CAP_TSP_RETURNVALUE_INFO;
118 		break;
119 	case TSS_TSPCAP_PLATFORM_INFO:
120 		switch (subCap) {
121 		case TSS_TSPCAP_PLATFORM_TYPE:
122 			if ((*respData = calloc_tspi(tspContext, sizeof(UINT32))) == NULL) {
123 				LogError("malloc of %zd bytes failed", sizeof(UINT32));
124 				return TSPERR(TSS_E_OUTOFMEMORY);
125 			}
126 
127 			*respSize = sizeof(UINT32);
128 			*(UINT32 *)(*respData) = INTERNAL_CAP_TSP_PLATFORM_TYPE;
129 			break;
130 		case TSS_TSPCAP_PLATFORM_VERSION:
131 			if ((*respData = calloc_tspi(tspContext, sizeof(UINT32))) == NULL) {
132 				LogError("malloc of %zd bytes failed", sizeof(UINT32));
133 				return TSPERR(TSS_E_OUTOFMEMORY);
134 			}
135 
136 			*respSize = sizeof(UINT32);
137 			*(UINT32 *)(*respData) = INTERNAL_CAP_TSP_PLATFORM_VERSION;
138 			break;
139 		default:
140 			return TSPERR(TSS_E_BAD_PARAMETER);
141 		}
142 		break;
143 	case TSS_TSPCAP_MANUFACTURER:
144 		switch (subCap) {
145 		case TSS_TSPCAP_PROP_MANUFACTURER_ID:
146 			if ((*respData = calloc_tspi(tspContext, sizeof(UINT32))) == NULL) {
147 				LogError("malloc of %zd bytes failed", sizeof(UINT32));
148 				return TSPERR(TSS_E_OUTOFMEMORY);
149 			}
150 
151 			*respSize = sizeof(UINT32);
152 			*(UINT32 *)(*respData) = INTERNAL_CAP_MANUFACTURER_ID;
153 			break;
154 		case TSS_TSPCAP_PROP_MANUFACTURER_STR:
155 		{
156 			BYTE str[] = INTERNAL_CAP_MANUFACTURER_STR;
157 
158 			if ((*respData = calloc_tspi(tspContext,
159 						     INTERNAL_CAP_MANUFACTURER_STR_LEN)) == NULL) {
160 				LogError("malloc of %d bytes failed",
161 					 INTERNAL_CAP_MANUFACTURER_STR_LEN);
162 				return TSPERR(TSS_E_OUTOFMEMORY);
163 			}
164 
165 			*respSize = INTERNAL_CAP_MANUFACTURER_STR_LEN;
166 			memcpy(*respData, str, INTERNAL_CAP_MANUFACTURER_STR_LEN);
167 			break;
168 		}
169 		default:
170 			return TSPERR(TSS_E_BAD_PARAMETER);
171 		}
172 		break;
173 	default:
174 		return TSPERR(TSS_E_BAD_PARAMETER);
175 	}
176 
177 	return TSS_SUCCESS;
178 }
179