xref: /netbsd-src/crypto/external/cpl/trousers/dist/src/tspi/tsp_daa.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. 2006
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 "trousers_types.h"
20 #include "spi_utils.h"
21 #include "capabilities.h"
22 #include "tsplog.h"
23 #include "tcs_tsp.h"
24 #include "tspps.h"
25 
26 
27 void
Trspi_LoadBlob_DAA_PK(UINT64 * offset,BYTE * blob,TSS_DAA_PK * pk)28 Trspi_LoadBlob_DAA_PK(UINT64 *offset, BYTE *blob, TSS_DAA_PK *pk)
29 {
30 	UINT32 i;
31 
32 	Trspi_LoadBlob_TSS_VERSION(offset, blob, pk->versionInfo);
33 
34 	Trspi_LoadBlob_UINT32(offset, pk->modulusLength, blob);
35 	Trspi_LoadBlob(offset, pk->modulusLength, blob, pk->modulus);
36 
37 	Trspi_LoadBlob_UINT32(offset, pk->capitalSLength, blob);
38 	Trspi_LoadBlob(offset, pk->capitalSLength, blob, pk->capitalS);
39 
40 	Trspi_LoadBlob_UINT32(offset, pk->capitalZLength, blob);
41 	Trspi_LoadBlob(offset, pk->capitalZLength, blob, pk->capitalZ);
42 
43 	Trspi_LoadBlob_UINT32(offset, pk->capitalR0Length, blob);
44 	Trspi_LoadBlob(offset, pk->capitalR0Length, blob, pk->capitalR0);
45 
46 	Trspi_LoadBlob_UINT32(offset, pk->capitalR1Length, blob);
47 	Trspi_LoadBlob(offset, pk->capitalR1Length, blob, pk->capitalR1);
48 
49 	Trspi_LoadBlob_UINT32(offset, pk->gammaLength, blob);
50 	Trspi_LoadBlob(offset, pk->gammaLength, blob, pk->gamma);
51 
52 	Trspi_LoadBlob_UINT32(offset, pk->capitalGammaLength, blob);
53 	Trspi_LoadBlob(offset, pk->capitalGammaLength, blob, pk->capitalGamma);
54 
55 	Trspi_LoadBlob_UINT32(offset, pk->rhoLength, blob);
56 	Trspi_LoadBlob(offset, pk->rhoLength, blob, pk->rho);
57 
58 	for (i = 0; i < pk->capitalYLength; i++)
59 		Trspi_LoadBlob(offset, pk->capitalYLength2, blob, pk->capitalY[i]);
60 
61 	Trspi_LoadBlob_UINT32(offset, pk->capitalYPlatformLength, blob);
62 
63 	Trspi_LoadBlob_UINT32(offset, pk->issuerBaseNameLength, blob);
64 	Trspi_LoadBlob(offset, pk->issuerBaseNameLength, blob, pk->issuerBaseName);
65 }
66 
67 TSS_RESULT
Trspi_UnloadBlob_DAA_PK(UINT64 * offset,BYTE * blob,TSS_DAA_PK * pk)68 Trspi_UnloadBlob_DAA_PK(UINT64 *offset, BYTE *blob, TSS_DAA_PK *pk)
69 {
70 	UINT32 i = 0, j;
71 
72 	__tspi_memset(pk, 0, sizeof(TSS_DAA_PK));
73 
74 	Trspi_UnloadBlob_TSS_VERSION(offset, blob, &pk->versionInfo);
75 
76 	Trspi_UnloadBlob_UINT32(offset, &pk->modulusLength, blob);
77 	if (pk->modulusLength > 0) {
78 		if ((pk->modulus = malloc(pk->modulusLength)) == NULL)
79 			return TSPERR(TSS_E_OUTOFMEMORY);
80 
81 		Trspi_UnloadBlob(offset, pk->modulusLength, blob, pk->modulus);
82 	} else {
83 		pk->modulus = NULL;
84 	}
85 
86 	Trspi_UnloadBlob_UINT32(offset, &pk->capitalSLength, blob);
87 	if (pk->capitalSLength > 0) {
88 		if ((pk->capitalS = malloc(pk->capitalSLength)) == NULL)
89 			goto error;
90 
91 		Trspi_UnloadBlob(offset, pk->capitalSLength, blob, pk->capitalS);
92 	} else {
93 		pk->capitalS = NULL;
94 	}
95 
96 	Trspi_UnloadBlob_UINT32(offset, &pk->capitalZLength, blob);
97 	if (pk->capitalZLength > 0) {
98 		if ((pk->capitalZ = malloc(pk->capitalZLength)) == NULL)
99 			goto error;
100 
101 		Trspi_UnloadBlob(offset, pk->capitalZLength, blob, pk->capitalZ);
102 	} else {
103 		pk->capitalZ = NULL;
104 	}
105 
106 	Trspi_UnloadBlob_UINT32(offset, &pk->capitalR0Length, blob);
107 	if (pk->capitalR0Length > 0) {
108 		if ((pk->capitalR0 = malloc(pk->capitalR0Length)) == NULL)
109 			goto error;
110 
111 		Trspi_UnloadBlob(offset, pk->capitalR0Length, blob, pk->capitalR0);
112 	} else {
113 		pk->capitalR0 = NULL;
114 	}
115 
116 	Trspi_UnloadBlob_UINT32(offset, &pk->capitalR1Length, blob);
117 	if (pk->capitalR1Length > 0) {
118 		if ((pk->capitalR1 = malloc(pk->capitalR1Length)) == NULL)
119 			goto error;
120 
121 		Trspi_UnloadBlob(offset, pk->capitalR1Length, blob, pk->capitalR1);
122 	} else {
123 		pk->capitalR1 = NULL;
124 	}
125 
126 	Trspi_UnloadBlob_UINT32(offset, &pk->gammaLength, blob);
127 	if (pk->gammaLength > 0) {
128 		if ((pk->gamma = malloc(pk->gammaLength)) == NULL)
129 			goto error;
130 
131 		Trspi_UnloadBlob(offset, pk->gammaLength, blob, pk->gamma);
132 	} else {
133 		pk->gamma = NULL;
134 	}
135 
136 	Trspi_UnloadBlob_UINT32(offset, &pk->capitalGammaLength, blob);
137 	if (pk->capitalGammaLength > 0) {
138 		if ((pk->capitalGamma = malloc(pk->capitalGammaLength)) == NULL)
139 			goto error;
140 
141 		Trspi_UnloadBlob(offset, pk->capitalGammaLength, blob, pk->capitalGamma);
142 	} else {
143 		pk->capitalGamma = NULL;
144 	}
145 
146 	Trspi_UnloadBlob_UINT32(offset, &pk->rhoLength, blob);
147 	if (pk->rhoLength > 0) {
148 		if ((pk->rho = malloc(pk->rhoLength)) == NULL)
149 			goto error;
150 
151 		Trspi_UnloadBlob(offset, pk->rhoLength, blob, pk->rho);
152 	} else {
153 		pk->rho = NULL;
154 	}
155 
156 	Trspi_UnloadBlob_UINT32(offset, &pk->capitalYLength, blob);
157 	Trspi_UnloadBlob_UINT32(offset, &pk->capitalYLength2, blob);
158 
159 	if (pk->capitalYLength > 0 && pk->capitalYLength2 > 0) {
160 		if ((pk->capitalY = calloc(pk->capitalYLength, sizeof(BYTE *))) == NULL)
161 			goto error;
162 
163 		for (i = 0; i < pk->capitalYLength; i++) {
164 			if ((pk->capitalY[i] = malloc(pk->capitalYLength2)) == NULL)
165 				goto error;
166 
167 			Trspi_UnloadBlob(offset, pk->capitalYLength2, blob, pk->capitalY[i]);
168 		}
169 	} else {
170 		pk->capitalY = NULL;
171 	}
172 
173 	Trspi_UnloadBlob_UINT32(offset, &pk->capitalYPlatformLength, blob);
174 
175 	Trspi_UnloadBlob_UINT32(offset, &pk->issuerBaseNameLength, blob);
176 	if (pk->issuerBaseNameLength > 0) {
177 		if ((pk->issuerBaseName = malloc(pk->issuerBaseNameLength)) == NULL)
178 			goto error;
179 
180 		Trspi_UnloadBlob(offset, pk->issuerBaseNameLength, blob, pk->issuerBaseName);
181 	} else {
182 		pk->issuerBaseName = NULL;
183 	}
184 
185 	return TSS_SUCCESS;
186 
187 error:
188 	free(pk->modulus);
189 	free(pk->capitalS);
190 	free(pk->capitalZ);
191 	free(pk->capitalR0);
192 	free(pk->capitalR1);
193 	free(pk->gamma);
194 	free(pk->capitalGamma);
195 	free(pk->rho);
196 	if (pk->capitalY) {
197 		for (j = 0; j < i; j++)
198 			free(pk->capitalY[j]);
199 
200 		free(pk->capitalY);
201 	}
202 	free(pk->issuerBaseName);
203 
204 	__tspi_memset(pk, 0, sizeof(TSS_DAA_PK));
205 
206 	return TSPERR(TSS_E_OUTOFMEMORY);
207 }
208