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
27void
28Trspi_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
67TSS_RESULT
68Trspi_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
187error:
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