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