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