summaryrefslogtreecommitdiff
path: root/src/tspi/tsp_daa.c
diff options
context:
space:
mode:
authorIgor Pashev <pashev.igor@gmail.com>2012-11-25 14:36:20 +0000
committerIgor Pashev <pashev.igor@gmail.com>2012-11-25 14:36:20 +0000
commitc3649a2def02c41d837ae1f79dda729ccb91e677 (patch)
treebea46dff212fdef977fe9094a70a939e8cc21885 /src/tspi/tsp_daa.c
downloadtrousers-upstream.tar.gz
Imported Upstream version 0.3.9upstream/0.3.9upstream
Diffstat (limited to 'src/tspi/tsp_daa.c')
-rw-r--r--src/tspi/tsp_daa.c207
1 files changed, 207 insertions, 0 deletions
diff --git a/src/tspi/tsp_daa.c b/src/tspi/tsp_daa.c
new file mode 100644
index 0000000..5afbf96
--- /dev/null
+++ b/src/tspi/tsp_daa.c
@@ -0,0 +1,207 @@
+
+/*
+ * Licensed Materials - Property of IBM
+ *
+ * trousers - An open source TCG Software Stack
+ *
+ * (C) Copyright International Business Machines Corp. 2006
+ *
+ */
+
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "trousers/tss.h"
+#include "trousers/trousers.h"
+#include "trousers_types.h"
+#include "trousers_types.h"
+#include "spi_utils.h"
+#include "capabilities.h"
+#include "tsplog.h"
+#include "tcs_tsp.h"
+#include "tspps.h"
+
+
+void
+Trspi_LoadBlob_DAA_PK(UINT64 *offset, BYTE *blob, TSS_DAA_PK *pk)
+{
+ UINT32 i;
+
+ Trspi_LoadBlob_TSS_VERSION(offset, blob, pk->versionInfo);
+
+ Trspi_LoadBlob_UINT32(offset, pk->modulusLength, blob);
+ Trspi_LoadBlob(offset, pk->modulusLength, blob, pk->modulus);
+
+ Trspi_LoadBlob_UINT32(offset, pk->capitalSLength, blob);
+ Trspi_LoadBlob(offset, pk->capitalSLength, blob, pk->capitalS);
+
+ Trspi_LoadBlob_UINT32(offset, pk->capitalZLength, blob);
+ Trspi_LoadBlob(offset, pk->capitalZLength, blob, pk->capitalZ);
+
+ Trspi_LoadBlob_UINT32(offset, pk->capitalR0Length, blob);
+ Trspi_LoadBlob(offset, pk->capitalR0Length, blob, pk->capitalR0);
+
+ Trspi_LoadBlob_UINT32(offset, pk->capitalR1Length, blob);
+ Trspi_LoadBlob(offset, pk->capitalR1Length, blob, pk->capitalR1);
+
+ Trspi_LoadBlob_UINT32(offset, pk->gammaLength, blob);
+ Trspi_LoadBlob(offset, pk->gammaLength, blob, pk->gamma);
+
+ Trspi_LoadBlob_UINT32(offset, pk->capitalGammaLength, blob);
+ Trspi_LoadBlob(offset, pk->capitalGammaLength, blob, pk->capitalGamma);
+
+ Trspi_LoadBlob_UINT32(offset, pk->rhoLength, blob);
+ Trspi_LoadBlob(offset, pk->rhoLength, blob, pk->rho);
+
+ for (i = 0; i < pk->capitalYLength; i++)
+ Trspi_LoadBlob(offset, pk->capitalYLength2, blob, pk->capitalY[i]);
+
+ Trspi_LoadBlob_UINT32(offset, pk->capitalYPlatformLength, blob);
+
+ Trspi_LoadBlob_UINT32(offset, pk->issuerBaseNameLength, blob);
+ Trspi_LoadBlob(offset, pk->issuerBaseNameLength, blob, pk->issuerBaseName);
+}
+
+TSS_RESULT
+Trspi_UnloadBlob_DAA_PK(UINT64 *offset, BYTE *blob, TSS_DAA_PK *pk)
+{
+ UINT32 i = 0, j;
+
+ memset(pk, 0, sizeof(TSS_DAA_PK));
+
+ Trspi_UnloadBlob_TSS_VERSION(offset, blob, &pk->versionInfo);
+
+ Trspi_UnloadBlob_UINT32(offset, &pk->modulusLength, blob);
+ if (pk->modulusLength > 0) {
+ if ((pk->modulus = malloc(pk->modulusLength)) == NULL)
+ return TSPERR(TSS_E_OUTOFMEMORY);
+
+ Trspi_UnloadBlob(offset, pk->modulusLength, blob, pk->modulus);
+ } else {
+ pk->modulus = NULL;
+ }
+
+ Trspi_UnloadBlob_UINT32(offset, &pk->capitalSLength, blob);
+ if (pk->capitalSLength > 0) {
+ if ((pk->capitalS = malloc(pk->capitalSLength)) == NULL)
+ goto error;
+
+ Trspi_UnloadBlob(offset, pk->capitalSLength, blob, pk->capitalS);
+ } else {
+ pk->capitalS = NULL;
+ }
+
+ Trspi_UnloadBlob_UINT32(offset, &pk->capitalZLength, blob);
+ if (pk->capitalZLength > 0) {
+ if ((pk->capitalZ = malloc(pk->capitalZLength)) == NULL)
+ goto error;
+
+ Trspi_UnloadBlob(offset, pk->capitalZLength, blob, pk->capitalZ);
+ } else {
+ pk->capitalZ = NULL;
+ }
+
+ Trspi_UnloadBlob_UINT32(offset, &pk->capitalR0Length, blob);
+ if (pk->capitalR0Length > 0) {
+ if ((pk->capitalR0 = malloc(pk->capitalR0Length)) == NULL)
+ goto error;
+
+ Trspi_UnloadBlob(offset, pk->capitalR0Length, blob, pk->capitalR0);
+ } else {
+ pk->capitalR0 = NULL;
+ }
+
+ Trspi_UnloadBlob_UINT32(offset, &pk->capitalR1Length, blob);
+ if (pk->capitalR1Length > 0) {
+ if ((pk->capitalR1 = malloc(pk->capitalR1Length)) == NULL)
+ goto error;
+
+ Trspi_UnloadBlob(offset, pk->capitalR1Length, blob, pk->capitalR1);
+ } else {
+ pk->capitalR1 = NULL;
+ }
+
+ Trspi_UnloadBlob_UINT32(offset, &pk->gammaLength, blob);
+ if (pk->gammaLength > 0) {
+ if ((pk->gamma = malloc(pk->gammaLength)) == NULL)
+ goto error;
+
+ Trspi_UnloadBlob(offset, pk->gammaLength, blob, pk->gamma);
+ } else {
+ pk->gamma = NULL;
+ }
+
+ Trspi_UnloadBlob_UINT32(offset, &pk->capitalGammaLength, blob);
+ if (pk->capitalGammaLength > 0) {
+ if ((pk->capitalGamma = malloc(pk->capitalGammaLength)) == NULL)
+ goto error;
+
+ Trspi_UnloadBlob(offset, pk->capitalGammaLength, blob, pk->capitalGamma);
+ } else {
+ pk->capitalGamma = NULL;
+ }
+
+ Trspi_UnloadBlob_UINT32(offset, &pk->rhoLength, blob);
+ if (pk->rhoLength > 0) {
+ if ((pk->rho = malloc(pk->rhoLength)) == NULL)
+ goto error;
+
+ Trspi_UnloadBlob(offset, pk->rhoLength, blob, pk->rho);
+ } else {
+ pk->rho = NULL;
+ }
+
+ Trspi_UnloadBlob_UINT32(offset, &pk->capitalYLength, blob);
+ Trspi_UnloadBlob_UINT32(offset, &pk->capitalYLength2, blob);
+
+ if (pk->capitalYLength > 0 && pk->capitalYLength2 > 0) {
+ if ((pk->capitalY = calloc(pk->capitalYLength, sizeof(BYTE *))) == NULL)
+ goto error;
+
+ for (i = 0; i < pk->capitalYLength; i++) {
+ if ((pk->capitalY[i] = malloc(pk->capitalYLength2)) == NULL)
+ goto error;
+
+ Trspi_UnloadBlob(offset, pk->capitalYLength2, blob, pk->capitalY[i]);
+ }
+ } else {
+ pk->capitalY = NULL;
+ }
+
+ Trspi_UnloadBlob_UINT32(offset, &pk->capitalYPlatformLength, blob);
+
+ Trspi_UnloadBlob_UINT32(offset, &pk->issuerBaseNameLength, blob);
+ if (pk->issuerBaseNameLength > 0) {
+ if ((pk->issuerBaseName = malloc(pk->issuerBaseNameLength)) == NULL)
+ goto error;
+
+ Trspi_UnloadBlob(offset, pk->issuerBaseNameLength, blob, pk->issuerBaseName);
+ } else {
+ pk->issuerBaseName = NULL;
+ }
+
+ return TSS_SUCCESS;
+
+error:
+ free(pk->modulus);
+ free(pk->capitalS);
+ free(pk->capitalZ);
+ free(pk->capitalR0);
+ free(pk->capitalR1);
+ free(pk->gamma);
+ free(pk->capitalGamma);
+ free(pk->rho);
+ if (pk->capitalY) {
+ for (j = 0; j < i; j++)
+ free(pk->capitalY[j]);
+
+ free(pk->capitalY);
+ }
+ free(pk->issuerBaseName);
+
+ memset(pk, 0, sizeof(TSS_DAA_PK));
+
+ return TSPERR(TSS_E_OUTOFMEMORY);
+}