summaryrefslogtreecommitdiff
path: root/src/tspi/daa/daa_structs.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tspi/daa/daa_structs.c')
-rw-r--r--src/tspi/daa/daa_structs.c1317
1 files changed, 1317 insertions, 0 deletions
diff --git a/src/tspi/daa/daa_structs.c b/src/tspi/daa/daa_structs.c
new file mode 100644
index 0000000..787d5d0
--- /dev/null
+++ b/src/tspi/daa/daa_structs.c
@@ -0,0 +1,1317 @@
+
+/*
+* Licensed Materials - Property of IBM
+*
+* trousers - An open source TCG Software Stack
+*
+* (C) Copyright International Business Machines Corp. 2006
+*
+*/
+
+/*
+This file implements Helper functions for converting / creating and freeing
+internal representation of TSS_DAA structures.
+An external representation is the one define in tss_structs.h.
+An internal representation is using bi_t or bi_ptr for representing big numbers.
+Naming convention: for each structures we can have:
+init_(<STRUCT>, struct *) : initialize the version field
+create_<STRUCT> : init all fields
+free_<STRUCT> : free all fields
+e_2_i_<STRUCT> : convertor from External representation to internal
+i_2_e_<STRUCT> : convertor from Internal to External. This call use a given memory
+allocation function, to allow
+for example to use calloc_tspi, or a "normal" malloc.
+*/
+#include <stdio.h>
+#include <strings.h>
+#include <errno.h>
+#include <strings.h>
+
+#include "daa_parameter.h"
+#include "daa_structs.h"
+#include "tcslog.h"
+
+#define DUMP_DAA_PK_FIELD( field) \
+do { \
+ printf("%s=", #field); \
+ dump_field( pk->field##Length, pk->field); \
+ puts(""); \
+} while(0);
+
+#if 0
+#define STORE_DAA_PK_BI1( field, bi) \
+do { \
+ store_bi( &pk->field##Length, &pk->field, bi); \
+} while(0);
+
+#define STORE_DAA_PK_BI( field, daa_alloc, param_alloc) \
+do { \
+ store_bi( &pk->field##Length,\
+ &pk->field,\
+ pk_internal->field,\
+ daa_alloc,\
+ param_alloc); \
+} while(0);
+
+// used only to read a structure from a file, so only as helping function
+// for TCG application
+static char buffer[1000];
+#endif
+BYTE *convert_alloc( TCS_CONTEXT_HANDLE tcsContext, UINT32 length, BYTE *source) {
+ BYTE *result = calloc_tspi( tcsContext, length);
+
+ if( result == NULL) return NULL;
+ memcpy( result, source, length);
+ free( source);
+ return result;
+}
+
+BYTE *copy_alloc( TCS_CONTEXT_HANDLE tcsContext, UINT32 length, BYTE *source) {
+ BYTE *result = calloc_tspi( tcsContext, length);
+
+ if( result == NULL) return NULL;
+ memcpy( result, source, length);
+ return result;
+}
+
+static void *normal_malloc( size_t size, TSS_HOBJECT object) {
+ void *ret = malloc( size);
+ return ret;
+}
+
+/* store a bi to a buffer and update the length in big endian format */
+void store_bi( UINT32 *length,
+ BYTE **buffer,
+ const bi_ptr i,
+ void * (*daa_alloc)(size_t size, TSS_HOBJECT object),
+ TSS_HOBJECT object
+) {
+ int size;
+
+ *buffer = (BYTE *)daa_alloc( bi_length( i), object);
+ bi_2_nbin1( &size, *buffer, i);
+ *length = size;
+ LogDebug( "[store_bi] host_length:%d network_length:%d[address:%d]\n",
+ size,
+ (int)*length,
+ (int)*buffer);
+}
+
+bi_ptr get_bi( const unsigned long n_length, const BYTE *buffer) {
+ unsigned long length;
+
+ length = n_length;
+ LogDebug( "[get_bi] %d [address:%d -> |%2x|%2x| ]\n",
+ (int)length,
+ (int)buffer,
+ (int)(buffer[0] &0xFF),
+ (int)(buffer[1]&0xFF));
+ return bi_set_as_nbin( length, buffer);
+}
+
+/* length is in network format: big indian */
+void dump_field( int length, BYTE *buffer) {
+ int i;
+
+ for( i=0; i< length; i++) {
+ BYTE byte = (BYTE)(buffer[i] & 0xFF);
+ printf("%02X", byte);
+ }
+}
+
+#if 0
+/* !: do not keep the return buffer */
+char *read_str(FILE *file) {
+ int i;
+ char c;
+
+ fgets( buffer, 1000, file);
+ i=0;
+ while( buffer[i] =='\n' || buffer[i]=='\r' || buffer[i]==' ') i++;
+ do {
+ c = buffer[ i++];
+ } while( c != 0 && c != ' ' && c!='\n' && c!='\r' && c!='#');
+ buffer[ i -1] = 0;
+ return buffer;
+}
+
+/**
+ *
+ * @param file
+ * @return
+ */
+int read_int( FILE *file) {
+ int i, ret;
+ char c;
+
+ fgets( buffer, 1000, file);
+ i=0;
+ while( buffer[i] =='\n' || buffer[i]=='\r' || buffer[i]==' ') i++;
+ do {
+ c = buffer[ i++];
+ } while( c != 0 && c != ' ' && c!='\n' && c!='\r' && c!='#');
+ buffer[ i -1] = 0;
+ sscanf( buffer, "%d", &ret);
+ return ret;
+}
+#endif
+/********************************************************************************************
+* TSS_DAA_SELECTED_ATTRIB
+* this struct is used internally and externally, only a call to
+internal_2_DAA_SELECTED_ATTRIB
+* and DAA_SELECTED_ATTRIB_2_internal will change the struct to be internal or
+external
+********************************************************************************************/
+
+void i_2_e_TSS_DAA_SELECTED_ATTRIB(
+ TSS_DAA_SELECTED_ATTRIB *selected_attrib
+) {
+}
+
+void e_2_i_TSS_DAA_SELECTED_ATTRIB(
+ TSS_DAA_SELECTED_ATTRIB *selected_attrib
+) {
+}
+
+/* work ONLY with internal format
+important: TSS_BOOL is of type int_8_t, so a char, if the size is bigger, we
+will maybe need
+to transform each part to big indian ? or maybe each part is false if equal to
+0, true otherwise.
+*/
+BYTE *to_bytes_TSS_DAA_SELECTED_ATTRIB_internal(
+ int *result_length,
+ TSS_DAA_SELECTED_ATTRIB *selected_attrib
+) {
+ BYTE *result;
+ int index = 0;
+ unsigned int length = selected_attrib->indicesListLength;
+
+ *result_length = sizeof(unsigned int) +
+ (selected_attrib->indicesListLength * sizeof(TSS_BOOL));
+ result = (BYTE *)malloc( *result_length);
+ memcpy( &result[index], &length, sizeof(UINT32));
+ index+=sizeof(UINT32);
+ memcpy( &result[index], selected_attrib->indicesList,
+ sizeof(TSS_BOOL) * selected_attrib->indicesListLength);
+ return result;
+}
+
+/*
+create a TSS_DAA_SELECTED_ATTRIB of length <length> with given selected attributes.
+example of selections of the second and third attributes upon 5:
+create_TSS_DAA_SELECTED_ATTRIB( &selected_attrib, 5, 0, 1, 1, 0, 0);
+*/
+void create_TSS_DAA_SELECTED_ATTRIB( TSS_DAA_SELECTED_ATTRIB *attrib, int length, ...) {
+ va_list ap;
+ int i, select;
+
+ attrib->indicesListLength = length;
+ attrib->indicesList = (TSS_BOOL *)malloc( length * sizeof( TSS_BOOL));
+ va_start (ap, length);
+ for( i=0; i<length; i++) {
+ select = va_arg( ap, int) != 0;
+ attrib->indicesList[i] = select;
+ }
+ va_end (ap);
+}
+
+
+/******************************************************************************************
+* TSS_DAA_SIGN_DATA
+* this struct is used internally and externally, only a call to internal_2_DAA_SIGN_DATA
+* DAA_SIGN_DATA_2_internal will change the struct to be internal or external
+*******************************************************************************************/
+
+void i_2_e_TSS_DAA_SIGN_DATA( TSS_DAA_SIGN_DATA *sign_data) {
+}
+
+void e_2_i_TSS_DAA_SIGN( TSS_DAA_SIGN_DATA *sign_data) {
+}
+
+/********************************************************************************************
+* TSS_DAA_ATTRIB_COMMIT
+********************************************************************************************/
+
+TSS_DAA_ATTRIB_COMMIT_internal *create_TSS_DAA_ATTRIB_COMMIT( bi_ptr beta, bi_ptr sMu) {
+ TSS_DAA_ATTRIB_COMMIT_internal *result =
+ (TSS_DAA_ATTRIB_COMMIT_internal *)malloc( sizeof(TSS_DAA_ATTRIB_COMMIT_internal));
+
+ result->beta = beta;
+ result->sMu = sMu;
+ return result;
+}
+
+
+/********************************************************************************************
+* TSS_DAA_PSEUDONYM_PLAIN
+********************************************************************************************/
+
+TSS_DAA_PSEUDONYM_PLAIN_internal *
+create_TSS_DAA_PSEUDONYM_PLAIN(bi_ptr nV)
+{
+ TSS_DAA_PSEUDONYM_PLAIN_internal *result = (TSS_DAA_PSEUDONYM_PLAIN_internal *)
+ malloc(sizeof(TSS_DAA_PSEUDONYM_PLAIN_internal));
+
+ result->nV = nV;
+ return result;
+}
+
+/********************************************************************************************
+* DAA PRIVATE KEY
+********************************************************************************************/
+/*
+* allocate: ret->p_prime
+* ret->q_prime
+* ret->productPQprime
+*/
+DAA_PRIVATE_KEY_internal *
+create_TSS_DAA_PRIVATE_KEY(bi_ptr pPrime, bi_ptr qPrime)
+{
+ DAA_PRIVATE_KEY_internal *private_key =
+ (DAA_PRIVATE_KEY_internal *)malloc( sizeof( DAA_PRIVATE_KEY_internal));
+
+ private_key->p_prime = bi_new_ptr(); bi_set( private_key->p_prime, pPrime);
+ private_key->q_prime = bi_new_ptr(); bi_set( private_key->q_prime, qPrime);
+ private_key->productPQprime = bi_new_ptr();
+ bi_mul( private_key->productPQprime, pPrime, qPrime);
+ return private_key;
+}
+
+#if 0
+int
+save_DAA_PRIVATE_KEY(FILE *file, const DAA_PRIVATE_KEY_internal *private_key)
+{
+ BI_SAVE( private_key->p_prime , file);
+ BI_SAVE( private_key->q_prime , file);
+ BI_SAVE( private_key->productPQprime, file);
+ return 0;
+}
+
+DAA_PRIVATE_KEY_internal *
+load_DAA_PRIVATE_KEY(FILE *file)
+{
+ DAA_PRIVATE_KEY_internal *private_key =
+ (DAA_PRIVATE_KEY_internal *)malloc( sizeof(DAA_PRIVATE_KEY_internal));
+
+ private_key->p_prime = bi_new_ptr();
+ BI_LOAD( private_key->p_prime, file);
+ private_key->q_prime = bi_new_ptr();
+ BI_LOAD( private_key->q_prime, file);
+ private_key->productPQprime = bi_new_ptr();
+ BI_LOAD( private_key->productPQprime, file);
+ return private_key;
+}
+#endif
+DAA_PRIVATE_KEY_internal *e_2_i_TSS_DAA_PRIVATE_KEY(TSS_DAA_PRIVATE_KEY *private_key) {
+ DAA_PRIVATE_KEY_internal *private_key_internal;
+
+ LogDebug("-> e_2_i_TSS_DAA_PRIVATE_KEY");
+ private_key_internal =
+ (DAA_PRIVATE_KEY_internal *)malloc( sizeof(DAA_PRIVATE_KEY_internal));
+ private_key_internal->p_prime = get_bi( private_key->p_primeLength, private_key->p_prime);
+ private_key_internal->q_prime = get_bi( private_key->q_primeLength, private_key->q_prime);
+ private_key_internal->productPQprime =
+ get_bi( private_key->productPQprimeLength, private_key->productPQprime);
+ LogDebug("<- e_2_i_TSS_DAA_PRIVATE_KEY");
+ return private_key_internal;
+}
+
+TSS_DAA_PRIVATE_KEY *
+i_2_e_TSS_DAA_PRIVATE_KEY(DAA_PRIVATE_KEY_internal *private_key_internal,
+ void * (*daa_alloc)(size_t size, TSS_HOBJECT object),
+ TSS_HOBJECT param_alloc)
+{
+ TSS_DAA_PRIVATE_KEY *result;
+
+ LogDebug("-> i_2_e_TSS_DAA_PRIVATE_KEY");
+ result = (TSS_DAA_PRIVATE_KEY *)daa_alloc( sizeof(TSS_DAA_PRIVATE_KEY), param_alloc);
+ init_tss_version( result);
+ store_bi( &(result->p_primeLength),
+ &(result->p_prime),
+ private_key_internal->p_prime,
+ daa_alloc,
+ param_alloc);
+ store_bi( &(result->q_primeLength),
+ &(result->q_prime),
+ private_key_internal->q_prime,
+ daa_alloc,
+ param_alloc);
+ store_bi( &(result->productPQprimeLength),
+ &(result->productPQprime),
+ private_key_internal->productPQprime,
+ daa_alloc,
+ param_alloc);
+ LogDebug("<- i_2_e_TSS_DAA_PRIVATE_KEY");
+ return result;
+}
+
+/********************************************************************************************
+* KEY PAIR WITH PROOF
+********************************************************************************************/
+
+#if 0
+
+/* moved to daa_debug.c */
+
+int
+save_KEY_PAIR_WITH_PROOF(FILE *file,
+ KEY_PAIR_WITH_PROOF_internal *key_pair_with_proof)
+{
+ save_DAA_PK_internal( file, key_pair_with_proof->pk);
+ save_DAA_PRIVATE_KEY( file, key_pair_with_proof->private_key);
+ save_DAA_PK_PROOF_internal( file, key_pair_with_proof->proof);
+
+ return 0;
+}
+
+KEY_PAIR_WITH_PROOF_internal *
+load_KEY_PAIR_WITH_PROOF(FILE *file)
+{
+ KEY_PAIR_WITH_PROOF_internal *key_pair_with_proof =
+ (KEY_PAIR_WITH_PROOF_internal *)malloc(sizeof(KEY_PAIR_WITH_PROOF_internal));
+
+ key_pair_with_proof->pk = load_DAA_PK_internal(file);
+ key_pair_with_proof->private_key = load_DAA_PRIVATE_KEY(file);
+ key_pair_with_proof->proof = load_DAA_PK_PROOF_internal(file);
+
+ return key_pair_with_proof;
+}
+
+#endif
+/* allocated using instrumented daa_alloc */
+TSS_DAA_KEY_PAIR *get_TSS_DAA_KEY_PAIR(KEY_PAIR_WITH_PROOF_internal *key_pair_with_proof,
+ void * (*daa_alloc)(size_t size, TSS_HOBJECT object),
+ TSS_HOBJECT param_alloc)
+{
+ TSS_DAA_KEY_PAIR *result;
+
+ LogDebug("-> i_2_e_KEY_PAIR_WITH_PROOF");
+
+ result = (TSS_DAA_KEY_PAIR *)daa_alloc(sizeof(TSS_DAA_KEY_PAIR), param_alloc);
+ init_tss_version(result);
+ result->private_key = i_2_e_TSS_DAA_PRIVATE_KEY(key_pair_with_proof->private_key,
+ daa_alloc, param_alloc);
+ result->public_key = i_2_e_TSS_DAA_PK( key_pair_with_proof->pk, daa_alloc, param_alloc);
+
+ LogDebug("<- i_2_e_KEY_PAIR_WITH_PROOF");
+
+ return result;
+}
+
+
+/********************************************************************************************
+* TSS_DAA_PK
+********************************************************************************************/
+
+/* pk_internal->capitalY must be alocated using ALLOC_BI_ARRAY() */
+void
+populate_capitalY(TSS_DAA_PK_internal *pk_internal)
+{
+ int i;
+
+ bi_new_array(pk_internal->capitalY,
+ pk_internal->capitalRReceiver->length + pk_internal->capitalRIssuer->length);
+
+ // CAPITAL Y ( capitalRReceiver )
+ for (i = 0; i < pk_internal->capitalRReceiver->length; i++)
+ pk_internal->capitalY->array[i] = pk_internal->capitalRReceiver->array[i];
+ // CAPITAL Y ( capitalRIssuer)
+ for (i = 0; i < pk_internal->capitalRIssuer->length; i++)
+ pk_internal->capitalY->array[pk_internal->capitalRReceiver->length+i] =
+ pk_internal->capitalRIssuer->array[i];
+}
+
+void
+compute_capitalSprime(TSS_DAA_PK_internal *pk_internal)
+{
+ bi_t bi_tmp;
+
+ bi_new(bi_tmp);
+ pk_internal->capitalSprime = bi_new_ptr();
+ bi_shift_left( bi_tmp, bi_1, DAA_PARAM_SIZE_SPLIT_EXPONENT);
+ bi_mod_exp(pk_internal->capitalSprime, pk_internal->capitalS, bi_tmp, pk_internal->modulus);
+ bi_free( bi_tmp);
+}
+
+/*
+* create anf feel a TSS_DAA_PK_internal structures
+* ! this function keep pointer on all parameters
+*/
+TSS_DAA_PK_internal *
+create_DAA_PK(const bi_ptr modulus,
+ const bi_ptr capitalS,
+ const bi_ptr capitalZ,
+ const bi_ptr capitalR0,
+ const bi_ptr capitalR1,
+ const bi_ptr gamma,
+ const bi_ptr capitalGamma,
+ const bi_ptr rho,
+ const bi_array_ptr capitalRReceiver,
+ const bi_array_ptr capitalRIssuer,
+ const int issuerBaseNameLength,
+ BYTE * const issuerBaseName)
+{
+ TSS_DAA_PK_internal *pk_internal;
+
+ LogDebug("-> create_DAA_PK");
+ pk_internal = (TSS_DAA_PK_internal *)malloc(sizeof(TSS_DAA_PK_internal));
+ pk_internal->modulus = modulus;
+ pk_internal->capitalS = capitalS;
+ pk_internal->capitalZ = capitalZ;
+ pk_internal->capitalR0 = capitalR0;
+ pk_internal->capitalR1 = capitalR1;
+ pk_internal->gamma = gamma;
+ pk_internal->capitalGamma = capitalGamma;
+ pk_internal->rho = rho;
+ pk_internal->capitalRReceiver = capitalRReceiver;
+ pk_internal->capitalRIssuer = capitalRIssuer;
+ pk_internal->capitalY = ALLOC_BI_ARRAY();
+ populate_capitalY( pk_internal);
+ pk_internal->issuerBaseNameLength = issuerBaseNameLength;
+ pk_internal->issuerBaseName = issuerBaseName;
+ compute_capitalSprime( pk_internal);
+
+ LogDebug("<- create_DAA_PK");
+
+ return pk_internal;
+}
+
+#if 0
+
+/* moved to daa_debug.c */
+
+int
+save_DAA_PK_internal(FILE *file, const TSS_DAA_PK_internal *pk_internal)
+{
+ char *buffer;
+
+ LogDebug("-> save_DAA_PK_internal");
+
+ BI_SAVE( pk_internal->modulus, file);
+ BI_SAVE( pk_internal->capitalS, file);
+ BI_SAVE( pk_internal->capitalZ, file);
+ BI_SAVE( pk_internal->capitalR0, file);
+ BI_SAVE( pk_internal->capitalR1, file);
+ BI_SAVE( pk_internal->gamma, file);
+ BI_SAVE( pk_internal->capitalGamma, file);
+ BI_SAVE( pk_internal->rho, file);
+ BI_SAVE_ARRAY( pk_internal->capitalRReceiver, file);
+ BI_SAVE_ARRAY( pk_internal->capitalRIssuer, file);
+ fprintf( file, "%d\n", pk_internal->issuerBaseNameLength);
+ buffer = (char *)malloc( pk_internal->issuerBaseNameLength + 1);
+ memcpy( buffer, pk_internal->issuerBaseName, pk_internal->issuerBaseNameLength);
+ buffer[ pk_internal->issuerBaseNameLength] = 0;
+ fprintf( file, "%s\n", buffer);
+ free( buffer);
+
+ LogDebug("<- save_DAA_PK_internal");
+
+ return 0;
+}
+
+TSS_DAA_PK_internal *
+load_DAA_PK_internal(FILE *file)
+{
+ TSS_DAA_PK_internal *pk_internal =
+ (TSS_DAA_PK_internal *)malloc(sizeof(TSS_DAA_PK_internal));
+ char *read_buffer;
+
+ pk_internal->modulus = bi_new_ptr();
+ BI_LOAD( pk_internal->modulus, file);
+ pk_internal->capitalS = bi_new_ptr();
+ BI_LOAD( pk_internal->capitalS, file);
+ pk_internal->capitalZ = bi_new_ptr();
+ BI_LOAD( pk_internal->capitalZ, file);
+ pk_internal->capitalR0 = bi_new_ptr();
+ BI_LOAD( pk_internal->capitalR0, file);
+ pk_internal->capitalR1 = bi_new_ptr();
+ BI_LOAD( pk_internal->capitalR1, file);
+ pk_internal->gamma = bi_new_ptr();
+ BI_LOAD( pk_internal->gamma, file);
+ pk_internal->capitalGamma = bi_new_ptr();
+ BI_LOAD( pk_internal->capitalGamma, file);
+ pk_internal->rho = bi_new_ptr();
+ BI_LOAD( pk_internal->rho, file);
+ pk_internal->capitalRReceiver = ALLOC_BI_ARRAY();
+ BI_LOAD_ARRAY( pk_internal->capitalRReceiver, file);
+ pk_internal->capitalRIssuer = ALLOC_BI_ARRAY();
+ BI_LOAD_ARRAY( pk_internal->capitalRIssuer, file);
+ pk_internal->capitalY = ALLOC_BI_ARRAY();
+ populate_capitalY( pk_internal);
+ pk_internal->issuerBaseNameLength = read_int( file);
+ read_buffer = read_str( file);
+ pk_internal->issuerBaseName = malloc( pk_internal->issuerBaseNameLength);
+ memcpy( pk_internal->issuerBaseName, read_buffer, pk_internal->issuerBaseNameLength);
+ compute_capitalSprime( pk_internal);
+ return pk_internal;
+}
+
+#endif
+void
+dump_DAA_PK_internal(char *name, TSS_DAA_PK_internal *pk_internal)
+{
+ LogDebug("Dump TSS_DAA_PK_internal:%s\n", name);
+
+ DUMP_BI( pk_internal->modulus);
+ DUMP_BI( pk_internal->capitalS);
+ DUMP_BI( pk_internal->capitalZ);
+ DUMP_BI( pk_internal->capitalR0);
+ DUMP_BI( pk_internal->capitalR1);
+ DUMP_BI( pk_internal->gamma);
+ DUMP_BI( pk_internal->capitalGamma);
+ DUMP_BI( pk_internal->rho);
+ DUMP_BI_ARRAY( pk_internal->capitalRReceiver);
+ DUMP_BI_ARRAY( pk_internal->capitalRIssuer);
+
+ LogDebug("issuerBaseName = %s\n", pk_internal->issuerBaseName);
+ LogDebug("End Dump TSS_DAA_PK_internal:%s\n", name);
+}
+
+/*
+* Encode the DAA_PK like java.security.Key#getEncoded
+*/
+BYTE *
+encoded_DAA_PK_internal(int *result_length, const TSS_DAA_PK_internal *pk)
+{
+ int length_issuer_base_name = pk->issuerBaseNameLength;
+ int total_length = DAA_PARAM_TSS_VERSION_LENGTH +
+ 5 * ((DAA_PARAM_SIZE_RSA_MODULUS / 8)+ sizeof(int)) +
+ 2 * ((DAA_PARAM_SIZE_MODULUS_GAMMA / 8)+sizeof(int)) +
+ 1 * ((DAA_PARAM_SIZE_RHO / 8)+sizeof(int)) +
+ pk->capitalY->length*(((DAA_PARAM_SIZE_RSA_MODULUS / 8)+sizeof(int)))
+ + length_issuer_base_name;
+ BYTE *result = (BYTE *)malloc(total_length);
+ int i, index = 0, length, big_indian_length;
+
+ if (result == NULL)
+ return NULL;
+
+ LogDebug("total_length=%d", total_length);
+ for (index = 0; index < DAA_PARAM_TSS_VERSION_LENGTH; index++)
+ result[index] = DAA_PARAM_TSS_VERSION[index];
+ // n, capitalS, capitalZ, capitalR0, capitalR1
+ length = DAA_PARAM_SIZE_RSA_MODULUS / 8;
+ big_indian_length = length;
+ memcpy(&result[index], &big_indian_length, sizeof(int));
+ index += sizeof(int);
+ bi_2_byte_array( &result[index], length, pk->modulus);
+ index += length;
+ memcpy(&result[index], &big_indian_length, sizeof(int));
+ index += sizeof(int);
+ bi_2_byte_array( &result[index], length, pk->capitalS);
+ index += length;
+ memcpy(&result[index], &big_indian_length, sizeof(int));
+ index += sizeof(int);
+ bi_2_byte_array( &result[index], length, pk->capitalZ);
+ index += length;
+ memcpy(&result[index], &big_indian_length, sizeof(int));
+ index += sizeof(int);
+ bi_2_byte_array( &result[index], length, pk->capitalR0);
+ index += length;
+ memcpy(&result[index], &big_indian_length, sizeof(int));
+ index += sizeof(int);
+ bi_2_byte_array( &result[index], length, pk->capitalR1);
+ index += length;
+ // gamma, capitalGamma
+ length = DAA_PARAM_SIZE_MODULUS_GAMMA / 8;
+ big_indian_length = length;
+ memcpy(&result[index], &big_indian_length, sizeof(int));
+ index += sizeof(int);
+ bi_2_byte_array( &result[index], length, pk->gamma);
+ index += length;
+ memcpy(&result[index], &big_indian_length, sizeof(int));
+ index += sizeof(int);
+ bi_2_byte_array( &result[index], length, pk->capitalGamma);
+ index += length;
+ // rho
+ length = DAA_PARAM_SIZE_RHO / 8;
+ big_indian_length = length;
+ memcpy(&result[index], &big_indian_length, sizeof(int));
+ index += sizeof(int);
+ bi_2_byte_array( &result[index], length, pk->rho);
+ index += length;
+ // capitalY
+ length = DAA_PARAM_SIZE_RSA_MODULUS / 8;
+ big_indian_length = length;
+
+ for( i=0; i<pk->capitalY->length; i++) {
+ memcpy( &result[index], &big_indian_length, sizeof(int));
+ index+=sizeof(int);
+ bi_2_byte_array( &result[index], length, pk->capitalY->array[i]);
+ index+=length;
+ }
+ // basename
+ memcpy( &result[index], pk->issuerBaseName, length_issuer_base_name);
+ index+=length_issuer_base_name;
+ *result_length = index;
+
+ LogDebug("return length=%d", index);
+
+ return result;
+}
+
+/* create anf feel a TSS_DAA_PK structures */
+TSS_DAA_PK *
+i_2_e_TSS_DAA_PK(TSS_DAA_PK_internal *pk_internal,
+ void *(*daa_alloc)(size_t size, TSS_HOBJECT param_alloc),
+ TSS_HOBJECT param_alloc)
+{
+ int i;
+ int capitalYLength;
+ int capitalYLength2;
+ TSS_DAA_PK *pk;
+
+ LogDebug("-> i_2_e_TSS_DAA_PK");
+ pk = (TSS_DAA_PK *)daa_alloc( sizeof(TSS_DAA_PK), param_alloc);
+ init_tss_version( pk);
+ if (pk == NULL) {
+ LogError("Can not allocate the TSS_DAA_PK structure");
+ return NULL;
+ }
+ STORE_DAA_PK_BI( modulus, daa_alloc, param_alloc);
+ STORE_DAA_PK_BI( capitalS, daa_alloc, param_alloc);
+ STORE_DAA_PK_BI( capitalZ, daa_alloc, param_alloc);
+ STORE_DAA_PK_BI( capitalR0, daa_alloc, param_alloc);
+ STORE_DAA_PK_BI( capitalR1, daa_alloc, param_alloc);
+ STORE_DAA_PK_BI( gamma, daa_alloc, param_alloc);
+ STORE_DAA_PK_BI( capitalGamma, daa_alloc, param_alloc);
+ STORE_DAA_PK_BI( rho, daa_alloc, param_alloc);
+ capitalYLength = pk_internal->capitalY->length;
+ capitalYLength2 = bi_nbin_size( pk_internal->capitalY->array[0]);
+ LogDebug("[capitalYLength=%d capitalYLength2=%d total size=%d]\n",
+ capitalYLength, capitalYLength2, sizeof(BYTE) * capitalYLength *
+ capitalYLength2);
+ pk->capitalY = (BYTE **) daa_alloc( sizeof(BYTE *) * capitalYLength, param_alloc );
+ for (i = 0; i < capitalYLength; i++) {
+ if( bi_nbin_size( pk_internal->capitalY->array[i]) != capitalYLength2) {
+ // LOG ERROR
+ LogError("Error during feel operation of capitalY (index=%d capitalYLength"
+ "2=%d, currentSize=%d)\n", i, capitalYLength2,
+ (int)bi_nbin_size(pk_internal->capitalY->array[i]));
+ }
+ BYTE *buffer = (BYTE*) daa_alloc( sizeof(BYTE) * capitalYLength2, param_alloc);
+ bi_2_byte_array( buffer, capitalYLength2, pk_internal->capitalY->array[i]);
+ // bi_2_nbin1( &checkSize, buffer, pk_internal->capitalY->array[i]);
+ pk->capitalY[i] = buffer;
+ LogDebug( "[i=%d currentsize=%d buffer[%d]=[%2x|%2x]\n",
+ i,
+ (int)bi_nbin_size( pk_internal->capitalY->array[i]),
+ (int)pk->capitalY[i],
+ (int)pk->capitalY[i][0],
+ (int)pk->capitalY[i][1]);
+ }
+ pk->capitalYLength = capitalYLength;
+ pk->capitalYLength2 = capitalYLength2;
+ pk->capitalYPlatformLength = pk_internal->capitalRReceiver->length;
+ LogDebug("issuer= len=%d", pk_internal->issuerBaseNameLength);
+ pk->issuerBaseNameLength = pk_internal->issuerBaseNameLength;
+ pk->issuerBaseName = (BYTE *)daa_alloc(pk_internal->issuerBaseNameLength, param_alloc);
+ memcpy( pk->issuerBaseName,
+ pk_internal->issuerBaseName,
+ pk_internal->issuerBaseNameLength);
+ LogDebug("i_2_e_TSS_DAA_PK extern_issuer=%s intern_issuer=%s\n",
+ pk->issuerBaseName,
+ pk_internal->issuerBaseName);
+ LogDebug("<- i_2_e_TSS_DAA_PK");
+ return pk;
+}
+
+/**/
+TSS_DAA_PK_internal *
+e_2_i_TSS_DAA_PK( TSS_DAA_PK *pk)
+{
+ TSS_DAA_PK_internal *pk_internal =
+ (TSS_DAA_PK_internal *)malloc(sizeof(TSS_DAA_PK_internal));
+ unsigned long capitalYLength, capitalYLength2, capitalYPlatformLength;
+ UINT32 i;
+ int issuer_length;
+
+ // pk_internal->modulus = GET_DAA_PK_BI( modulus);
+ pk_internal->modulus = get_bi(pk->modulusLength, pk->modulus);
+ pk_internal->capitalS = get_bi(pk->capitalSLength, pk->capitalS);
+ pk_internal->capitalZ = get_bi(pk->capitalZLength, pk->capitalZ);
+ pk_internal->capitalR0 = get_bi(pk->capitalR0Length, pk->capitalR0);
+ pk_internal->capitalR1 = get_bi(pk->capitalR1Length, pk->capitalR1);
+ pk_internal->gamma = get_bi(pk->gammaLength, pk->gamma);
+ pk_internal->capitalGamma = get_bi(pk->capitalGammaLength, pk->capitalGamma);
+ pk_internal->rho = get_bi(pk->rhoLength, pk->rho);
+ capitalYLength = pk->capitalYLength;
+ capitalYLength2= pk->capitalYLength2;
+ capitalYPlatformLength = pk->capitalYPlatformLength;
+ LogDebug( "capitalYLength:%ld capitalYLength2:%ld capitalYPlatformLength:%ld\n",
+ capitalYLength, capitalYLength2, capitalYPlatformLength);
+
+ pk_internal->capitalRReceiver = ALLOC_BI_ARRAY();
+ bi_new_array2(pk_internal->capitalRReceiver, capitalYPlatformLength);
+ for (i = 0; i < capitalYPlatformLength; i++) {
+ LogDebug( "i=%d\n", i);
+ pk_internal->capitalRReceiver->array[i] =
+ get_bi(pk->capitalYLength2, pk->capitalY[i]);
+ }
+ pk_internal->capitalRIssuer = ALLOC_BI_ARRAY();
+ bi_new_array2( pk_internal->capitalRIssuer, capitalYLength -
+ capitalYPlatformLength);
+ for( ; i<capitalYLength; i++) {
+ pk_internal->capitalRIssuer->array[ i - capitalYPlatformLength] =
+ get_bi( pk->capitalYLength2, pk->capitalY[i]);
+ }
+ pk_internal->capitalY = ALLOC_BI_ARRAY();
+ populate_capitalY( pk_internal);
+ issuer_length = pk->issuerBaseNameLength;
+ pk_internal->issuerBaseNameLength = issuer_length;
+ LogDebug( "issuer_length=%d\n", issuer_length);
+ pk_internal->issuerBaseName = (BYTE *)malloc( issuer_length);
+ memcpy( pk_internal->issuerBaseName, pk->issuerBaseName, issuer_length);
+ LogDebug("e_2_i_TSS_DAA_PK extern_issuer=%s intern_issuer=%s\n",
+ pk->issuerBaseName,
+ pk_internal->issuerBaseName);
+ compute_capitalSprime( pk_internal); // allocation
+ return pk_internal;
+}
+
+void
+free_TSS_DAA_PK_internal(TSS_DAA_PK_internal *pk_internal)
+{
+ bi_free_ptr( pk_internal->capitalSprime);
+ free( pk_internal->issuerBaseName);
+ free( pk_internal->capitalY);
+ bi_free_array( pk_internal->capitalRIssuer);
+ bi_free_array( pk_internal->capitalRReceiver);
+ bi_free_ptr( pk_internal->rho);
+ bi_free_ptr( pk_internal->capitalGamma);
+ bi_free_ptr( pk_internal->gamma);
+ bi_free_ptr( pk_internal->capitalR1);
+ bi_free_ptr( pk_internal->capitalR0);
+ bi_free_ptr( pk_internal->capitalZ);
+ bi_free_ptr( pk_internal->capitalS);
+ bi_free_ptr( pk_internal->modulus);
+ free( pk_internal);
+}
+
+/* free a TSS_DAA_PK structures */
+void
+free_TSS_DAA_PK(TSS_DAA_PK *pk)
+{
+ int i;
+
+ LogDebug("-> free_TSS_DAA_PK");
+ free( pk->modulus);
+ free( pk->capitalS);
+ free( pk->capitalZ);
+ free( pk->capitalR0);
+ free( pk->capitalR1);
+ free( pk->gamma);
+ free( pk->capitalGamma);
+ free( pk->rho);
+ for( i=0; i<(int)pk->capitalYLength; i++) {
+ free( pk->capitalY[i]);
+ }
+ free( pk->capitalY);
+ free( pk->issuerBaseName);
+ free( pk);
+ LogDebug("<- free_TSS_DAA_PK");
+
+}
+
+TPM_DAA_ISSUER *
+convert2issuer_settings(TSS_DAA_PK_internal *pk_internal)
+{
+ TPM_DAA_ISSUER *result = (TPM_DAA_ISSUER *)malloc(sizeof(TPM_DAA_ISSUER));
+ EVP_MD_CTX mdctx;
+ UINT32 length;
+ BYTE *array = (BYTE*)malloc((DAA_PARAM_SIZE_RSA_MODULUS+7)/8);
+
+ LogDebug("convert2issuer_settings");
+ EVP_MD_CTX_init(&mdctx);
+ // TAG
+ result->tag = htons( TPM_TAG_DAA_ISSUER);
+ // capitalR0
+ EVP_DigestInit(&mdctx, DAA_PARAM_get_message_digest());
+
+ EVP_DigestInit_ex(&mdctx, DAA_PARAM_get_message_digest(), NULL);
+ bi_2_byte_array( array,
+ length = (bi_length( pk_internal->capitalR0)+7)/8,
+ pk_internal->capitalR0);
+ LogDebug("capitalR0 length=%d", length);
+ EVP_DigestUpdate(&mdctx, array, length);
+ EVP_DigestFinal_ex(&mdctx, (BYTE *)&(result->DAA_digest_R0), NULL);
+ // capitalR1
+ EVP_DigestInit_ex(&mdctx, DAA_PARAM_get_message_digest(), NULL);
+ bi_2_byte_array( array,
+ length = (bi_length( pk_internal->capitalR1)+7)/8,
+ pk_internal->capitalR1);
+ LogDebug("capitalR1 length=%d", length);
+ EVP_DigestUpdate(&mdctx, array, length);
+ EVP_DigestFinal_ex(&mdctx, (BYTE *)&(result->DAA_digest_R1), NULL);
+ // capitalS (S0)
+ EVP_DigestInit_ex(&mdctx, DAA_PARAM_get_message_digest(), NULL);
+ bi_2_byte_array( array,
+ length = (bi_length( pk_internal->capitalS)+7)/8,
+ pk_internal->capitalS);
+ LogDebug("capitalS length=%d", length);
+ EVP_DigestUpdate(&mdctx, array, length);
+ EVP_DigestFinal_ex(&mdctx, (BYTE *)&(result->DAA_digest_S0), NULL);
+ // capitalSprime (S1)
+ EVP_DigestInit_ex(&mdctx, DAA_PARAM_get_message_digest(), NULL);
+ bi_2_byte_array( array,
+ length = (bi_length( pk_internal->capitalSprime)+7)/8,
+ pk_internal->capitalSprime);
+ LogDebug("capitalSprime length=%d", length);
+ EVP_DigestUpdate(&mdctx, array, length);
+ EVP_DigestFinal_ex(&mdctx, (BYTE *)&(result->DAA_digest_S1), NULL);
+ // modulus (n)
+ EVP_DigestInit_ex(&mdctx, DAA_PARAM_get_message_digest(), NULL);
+ bi_2_byte_array( array,
+ length = (bi_length( pk_internal->modulus)+7)/8,
+ pk_internal->modulus);
+ LogDebug("modulus length=%d", length);
+ EVP_DigestUpdate(&mdctx, array, length);
+ EVP_DigestFinal_ex(&mdctx, (BYTE *)&(result->DAA_digest_n), NULL);
+ // modulus (n)
+ EVP_DigestInit_ex(&mdctx, DAA_PARAM_get_message_digest(), NULL);
+ bi_2_byte_array( array,
+ length = (bi_length( pk_internal->capitalGamma)+7)/8,
+ pk_internal->capitalGamma);
+ LogDebug("capitalGamma length=%d", length);
+ EVP_DigestUpdate(&mdctx, array, length);
+ free(array);
+ EVP_DigestFinal_ex(&mdctx, (BYTE *)&(result->DAA_digest_gamma), NULL);
+ EVP_MD_CTX_cleanup(&mdctx);
+ // rho
+ bi_2_byte_array( (BYTE *)&(result->DAA_generic_q), 26, pk_internal->rho);
+ return result;
+}
+
+BYTE *
+issuer_2_byte_array(TPM_DAA_ISSUER *tpm_daa_issuer, int *length)
+{
+ UINT32 size = sizeof(UINT16) + ( 6 * TPM_SHA1_160_HASH_LEN) + 26;
+ BYTE * result = (BYTE *)malloc( sizeof(BYTE)*size);
+ UINT32 i = 0;
+
+ memcpy( &result[i], &(tpm_daa_issuer->tag), sizeof(UINT16));
+ i+=sizeof(UINT16);
+ memcpy( &result[i], &(tpm_daa_issuer->DAA_digest_R0), TPM_SHA1_160_HASH_LEN);
+ i+=TPM_SHA1_160_HASH_LEN;
+ memcpy( &result[i], &(tpm_daa_issuer->DAA_digest_R1), TPM_SHA1_160_HASH_LEN);
+ i+=TPM_SHA1_160_HASH_LEN;
+ memcpy( &result[i], &(tpm_daa_issuer->DAA_digest_S0), TPM_SHA1_160_HASH_LEN);
+ i+=TPM_SHA1_160_HASH_LEN;
+ memcpy( &result[i], &(tpm_daa_issuer->DAA_digest_S1), TPM_SHA1_160_HASH_LEN);
+ i+=TPM_SHA1_160_HASH_LEN;
+ memcpy( &result[i], &(tpm_daa_issuer->DAA_digest_n), TPM_SHA1_160_HASH_LEN);
+ i+=TPM_SHA1_160_HASH_LEN;
+ memcpy( &result[i], &(tpm_daa_issuer->DAA_digest_gamma), TPM_SHA1_160_HASH_LEN);
+ i+=TPM_SHA1_160_HASH_LEN;
+ memcpy( &result[i], &(tpm_daa_issuer->DAA_generic_q), 26);
+ *length = size;
+ return result;
+}
+
+/********************************************************************************************
+* TSS_DAA_PK_PROOF
+********************************************************************************************/
+
+/*
+* this function keep references on:
+* - challenge (BYTE *)
+* - response (bi_array_ptr *)
+*/
+TSS_DAA_PK_PROOF_internal *
+create_DAA_PK_PROOF(BYTE* const challenge,
+ const int length_challenge,
+ bi_array_ptr *response,
+ const int length_response)
+{
+ TSS_DAA_PK_PROOF_internal *pk_proof;
+
+#ifdef DAA_DEBUG
+ printf("create_DAA_PK_PROOF_internal\n");
+#endif
+ pk_proof = (TSS_DAA_PK_PROOF_internal *)malloc( sizeof(TSS_DAA_PK_PROOF_internal));
+ pk_proof->challenge = challenge;
+ pk_proof->length_challenge = length_challenge;
+ pk_proof->response = response;
+ pk_proof->length_response = length_response;
+ return pk_proof;
+}
+
+#if 0
+int
+save_DAA_PK_PROOF_internal(FILE *file, TSS_DAA_PK_PROOF_internal *proof)
+{
+ int i;
+
+#ifdef DAA_DEBUG
+ printf("save_DAA_PK_PROOF_internal");
+#endif
+ fprintf(file, "%d # %s.length\n", proof->length_challenge, "challenge");
+ fprintf(file, "%s\n", dump_byte_array( proof->length_challenge,
+ proof->challenge));
+ fprintf(file, "%d # %s.length\n", proof->length_response, "response");
+ for (i = 0; i < proof->length_response; i++) {
+ BI_SAVE_ARRAY( proof->response[i], file);
+ }
+
+ return 0;
+}
+
+/* load <proof> using <filename> */
+/* allocation of: */
+/* proof->challenge (BYTE*) */
+/* response (bi_array_ptr) */
+TSS_DAA_PK_PROOF_internal *
+load_DAA_PK_PROOF_internal(FILE *file)
+{
+ TSS_DAA_PK_PROOF_internal *proof =
+ (TSS_DAA_PK_PROOF_internal *)malloc(sizeof(TSS_DAA_PK_PROOF_internal));
+ char *read_buffer;
+ int i;
+
+#ifdef DAA_DEBUG
+ printf("load_DAA_PK_PROOF_internal");
+#endif
+ proof->length_challenge = read_int( file);
+ read_buffer = read_str( file);
+ proof->challenge = retrieve_byte_array( &(proof->length_challenge),read_buffer);
+ proof->length_response = read_int( file);
+ proof->response = (bi_array_ptr *)malloc( sizeof(bi_array_ptr) * proof->length_response);
+ for (i = 0; i < proof->length_response; i++) {
+ proof->response[i] = ALLOC_BI_ARRAY();
+ BI_LOAD_ARRAY( proof->response[i], file);
+ }
+ return proof;
+}
+#endif
+
+TSS_DAA_PK_PROOF *
+i_2_e_TSS_DAA_PK_PROOF(TSS_DAA_PK_PROOF_internal*pk_internal_proof,
+ void * (*daa_alloc)(size_t size, TSS_HOBJECT param),
+ TSS_HOBJECT param_alloc)
+{
+ TSS_DAA_PK_PROOF *pk_proof =
+ (TSS_DAA_PK_PROOF *)daa_alloc( sizeof(TSS_DAA_PK_PROOF), param_alloc);
+ int i, j;
+ int length_response2;
+ int length_response3;
+
+ init_tss_version( pk_proof);
+ // CHALLENGE
+ pk_proof->challengeLength = pk_internal_proof->length_challenge;
+ pk_proof->challenge = (BYTE *)daa_alloc( pk_internal_proof->length_challenge,
+ param_alloc);
+ memcpy( pk_proof->challenge, pk_internal_proof->challenge,
+ pk_internal_proof->length_challenge);
+ // RESPONSES
+ pk_proof->responseLength = pk_internal_proof->length_response;
+ length_response2 = pk_internal_proof->response[0]->length;
+ pk_proof->responseLength2 = length_response2;
+ length_response3 = bi_nbin_size(
+ pk_internal_proof->response[0]->array[0]);
+ if( length_response3 & 1) length_response3++; // length_response3 should be paire
+ pk_proof->responseLength3 = length_response3;
+ pk_proof->response = (BYTE ***)daa_alloc( sizeof(BYTE **) *
+ pk_internal_proof->length_response, param_alloc);
+ for(i = 0; i < pk_internal_proof->length_response; i++) {
+ pk_proof->response[i] = (BYTE **)daa_alloc( sizeof(BYTE *) * length_response2,
+ param_alloc);
+ for( j = 0; j < length_response2; j++) {
+ (pk_proof->response[i])[j] = (BYTE *)malloc(
+ sizeof(BYTE) * length_response3);
+ bi_2_byte_array( pk_proof->response[i][j],
+ length_response3,
+ pk_internal_proof->response[i]->array[j]);
+ }
+ }
+ return pk_proof;
+}
+
+TSS_DAA_PK_PROOF_internal *
+e_2_i_TSS_DAA_PK_PROOF(TSS_DAA_PK_PROOF *pk_proof)
+{
+ int i, j, response_length2;
+ TSS_DAA_PK_PROOF_internal *pk_proof_internal =
+ (TSS_DAA_PK_PROOF_internal *)malloc( sizeof( TSS_DAA_PK_PROOF_internal));
+
+ // CHALLENGE
+ pk_proof_internal->length_challenge = pk_proof->challengeLength;
+#ifdef DAA_DEBUG
+ fprintf(stderr, "issuer_length=%d\n", pk_proof_internal->length_challenge);
+#endif
+ pk_proof_internal->challenge = (BYTE *)malloc( pk_proof_internal->length_challenge);
+ memcpy( pk_proof_internal->challenge,
+ pk_proof->challenge,
+ pk_proof_internal->length_challenge);
+ // RESPONSES
+ pk_proof_internal->length_response = pk_proof->responseLength;
+ response_length2 = pk_proof->responseLength2;
+ pk_proof_internal->response =
+ (bi_array_ptr *)malloc( sizeof(bi_array_ptr) *
+ pk_proof_internal->length_response);
+ for(i = 0; i<pk_proof_internal->length_response; i++) {
+ pk_proof_internal->response[i] = ALLOC_BI_ARRAY();
+ bi_new_array2( pk_proof_internal->response[i], response_length2);
+ for( j = 0; j < response_length2; j++) {
+ pk_proof_internal->response[i]->array[j] =
+ get_bi( pk_proof->responseLength3, pk_proof->response[i][j]);
+ }
+ }
+ return pk_proof_internal;
+}
+
+
+/********************************************************************************************
+* TSS_DAA_JOIN_ISSUER_SESSION
+********************************************************************************************/
+
+TSS_DAA_JOIN_ISSUER_SESSION_internal *
+create(TSS_DAA_PK_PROOF_internal *issuerKeyPair,
+ TPM_DAA_ISSUER *issuerAuthKey,
+ TSS_DAA_IDENTITY_PROOF *identityProof,
+ bi_ptr capitalUprime,
+ int daaCounter,
+ int nonceIssuerLength,
+ BYTE *nonceIssuer,
+ int nonceEncryptedLength,
+ BYTE *nonceEncrypted)
+{
+ TSS_DAA_JOIN_ISSUER_SESSION_internal *result =
+ (TSS_DAA_JOIN_ISSUER_SESSION_internal *)malloc(
+ sizeof(TSS_DAA_JOIN_ISSUER_SESSION_internal));
+
+ result->issuerAuthKey = issuerAuthKey;
+ result->issuerKeyPair = issuerKeyPair;
+ result->identityProof = identityProof;
+ result->capitalUprime = capitalUprime;
+ result->daaCounter = daaCounter;
+ result->nonceIssuerLength = nonceIssuerLength;
+ result->nonceIssuer = nonceIssuer;
+ result->nonceEncryptedLength = nonceEncryptedLength;
+ result->nonceEncrypted = nonceEncrypted;
+ return result;
+}
+
+
+/********************************************************************************************
+ * TSS_DAA_SIGNATURE
+ ********************************************************************************************/
+
+TSS_DAA_SIGNATURE_internal*
+e_2_i_TSS_DAA_SIGNATURE(TSS_DAA_SIGNATURE* signature)
+{
+ TSS_DAA_SIGNATURE_internal *signature_intern =
+ (TSS_DAA_SIGNATURE_internal *)malloc( sizeof( TSS_DAA_SIGNATURE_internal));
+ int i, length;
+
+ signature_intern->zeta = bi_set_as_nbin( signature->zetaLength, signature->zeta);
+ signature_intern->capitalT = bi_set_as_nbin( signature->capitalTLength,
+ signature->capitalT);
+ signature_intern->challenge_length = signature->challengeLength;
+ signature_intern->challenge = (BYTE *)malloc( signature->challengeLength);
+ memcpy( signature_intern->challenge,
+ signature->challenge,
+ signature->challengeLength);
+ signature_intern->nonce_tpm_length = signature->nonceTpmLength;
+ signature_intern->nonce_tpm = (BYTE *)malloc( signature->nonceTpmLength);
+ memcpy( signature_intern->nonce_tpm, signature->nonceTpm, signature->nonceTpmLength);
+ signature_intern->sV = bi_set_as_nbin( signature->sVLength, signature->sV);
+ signature_intern->sF0 = bi_set_as_nbin( signature->sF0Length, signature->sF0);
+ signature_intern->sF1 = bi_set_as_nbin( signature->sF1Length, signature->sF1);
+ signature_intern->sE = bi_set_as_nbin( signature->sELength, signature->sE);
+ signature_intern->sA = (bi_array_ptr)malloc( sizeof( bi_array));
+ bi_new_array2( signature_intern->sA, signature->sALength);
+ length = ( DAA_PARAM_SIZE_RANDOMIZED_ATTRIBUTES + 7) / 8;
+ for (i = 0; i < (int)signature->sALength; i++) {
+ signature_intern->sA->array[i] = bi_set_as_nbin( length, signature->sA[i]);
+ }
+
+ return signature_intern;
+}
+
+void
+free_TSS_DAA_SIGNATURE_internal(TSS_DAA_SIGNATURE_internal *signature)
+{
+ bi_free_array( signature->sA);
+ bi_free_ptr( signature->sE);
+ bi_free_ptr( signature->sF1);
+ bi_free_ptr( signature->sF0);
+ bi_free_ptr( signature->sV);
+ free( signature->nonce_tpm);
+ free( signature->challenge);
+ bi_free_ptr( signature->capitalT);
+ bi_free_ptr( signature->zeta);
+ free( signature);
+}
+
+#if 0
+/********************************************************************************************
+ TSS_DAA_CRED_ISSUER
+********************************************************************************************/
+
+TSS_DAA_CRED_ISSUER *
+load_TSS_DAA_CRED_ISSUER(FILE *file)
+{
+ TSS_DAA_CRED_ISSUER *credential =
+ (TSS_DAA_CRED_ISSUER *)malloc(sizeof(TSS_DAA_CRED_ISSUER));
+ char *read_buffer;
+ int i, len;
+
+ init_tss_version( credential);
+ credential->capitalALength = read_int( file);
+ read_buffer = read_str( file);
+ credential->capitalA = retrieve_byte_array( &(credential->capitalALength),
+ read_buffer);
+ credential->eLength = read_int( file);
+ read_buffer = read_str( file);
+ credential->e = retrieve_byte_array( &(credential->eLength),read_buffer);
+ credential->vPrimePrimeLength = read_int( file);
+ read_buffer = read_str( file);
+ credential->vPrimePrime = retrieve_byte_array(&(credential->vPrimePrimeLength),
+ read_buffer);
+ // attributes issuer
+ credential->attributesIssuerLength = read_int( file);
+ credential->attributesIssuer = malloc(credential->attributesIssuerLength*sizeof(BYTE*));
+ for( i=0; i < (int)credential->attributesIssuerLength; i++) {
+ credential->attributesIssuer[i] = retrieve_byte_array( &len, read_buffer);
+ }
+ credential->cPrimeLength = read_int( file);
+ read_buffer = read_str( file);
+ credential->cPrime = retrieve_byte_array( &(credential->cPrimeLength),read_buffer);
+ credential->sELength = read_int( file);
+ read_buffer = read_str( file);
+ credential->sE = retrieve_byte_array( &(credential->sELength),read_buffer);
+ return credential;
+}
+
+int
+save_TSS_DAA_CRED_ISSUER(FILE *file, TSS_DAA_CRED_ISSUER *credential)
+{
+ int i;
+
+ fprintf(file, "%d # %s.length\n", credential->capitalALength, "capitalA");
+ fprintf(file, "%s\n", dump_byte_array( credential->capitalALength,
+ credential->capitalA));
+ fprintf(file, "%d # %s.length\n", credential->eLength, "e");
+ fprintf(file, "%s\n", dump_byte_array( credential->eLength,
+ credential->e));
+ fprintf(file, "%d # %s.length\n", credential->vPrimePrimeLength, "vPrimePrime");
+ fprintf(file, "%s\n", dump_byte_array( credential->vPrimePrimeLength,
+ credential->vPrimePrime));
+ fprintf(file, "%d # %s\n", credential->attributesIssuerLength, "attributesIssuerLength");
+ for( i=0; i < (int)credential->attributesIssuerLength; i++) {
+ fprintf(file, "%s\n", dump_byte_array( DAA_PARAM_SIZE_F_I / 8,
+ credential->attributesIssuer[i]));
+
+ }
+ fprintf(file, "%d # %s.length\n", credential->cPrimeLength, "cPrime");
+ fprintf(file, "%s\n", dump_byte_array( credential->cPrimeLength,
+ credential->cPrime));
+ fprintf(file, "%d # %s.length\n", credential->sELength, "sE");
+ fprintf(file, "%s\n", dump_byte_array( credential->sELength,
+ credential->sE));
+ return 0;
+}
+
+
+/********************************************************************************************
+ TSS_DAA_CREDENTIAL
+********************************************************************************************/
+
+TSS_DAA_CREDENTIAL *
+load_TSS_DAA_CREDENTIAL(FILE *file)
+{
+ TSS_DAA_CREDENTIAL *credential =
+ (TSS_DAA_CREDENTIAL *)malloc(sizeof(TSS_DAA_CREDENTIAL));
+ char *read_buffer;
+ int i, len;
+ TSS_DAA_PK_internal *pk_internal;
+ TSS_DAA_PK *pk;
+
+ init_tss_version( credential);
+ credential->capitalALength = read_int( file);
+ read_buffer = read_str( file);
+ credential->capitalA = retrieve_byte_array( &(credential->capitalALength),
+ read_buffer);
+ credential->exponentLength = read_int( file);
+ read_buffer = read_str( file);
+ credential->exponent = retrieve_byte_array( &(credential->exponentLength),
+ read_buffer);
+ credential->vBar0Length = read_int( file);
+ read_buffer = read_str( file);
+ credential->vBar0 = retrieve_byte_array(&(credential->vBar0Length),
+ read_buffer);
+ credential->vBar1Length = read_int( file);
+ read_buffer = read_str( file);
+ credential->vBar1 = retrieve_byte_array(&(credential->vBar1Length),
+ read_buffer);
+ // attributes issuer
+ credential->attributesLength = read_int( file);
+ printf("attributesLength=%d\n", credential->attributesLength);
+ credential->attributes = malloc(credential->attributesLength * sizeof( BYTE *));
+ for( i=0; i < (int)credential->attributesLength; i++) {
+ read_buffer = read_str( file);
+ credential->attributes[i] = retrieve_byte_array( &len, read_buffer);
+ if( len != DAA_PARAM_SIZE_F_I / 8) {
+ LogError("Error when parsing attributes");
+ LogError("\tattribute length:%d", len);
+ LogError("\texpected length:%d", DAA_PARAM_SIZE_F_I / 8);
+ return NULL;
+ }
+ }
+ pk_internal = load_DAA_PK_internal( file);
+ pk = i_2_e_TSS_DAA_PK( pk_internal, &normal_malloc, (TSS_HOBJECT)NULL);
+ memcpy( &(credential->issuerPK), pk, sizeof(TSS_DAA_PK));
+ free( pk);
+ free_TSS_DAA_PK_internal( pk_internal);
+ credential->tpmSpecificEncLength = read_int( file);
+ read_buffer = read_str( file);
+ credential->tpmSpecificEnc = retrieve_byte_array( &(credential->tpmSpecificEncLength),
+ read_buffer);
+ credential->daaCounter = read_int( file);
+ return credential;
+}
+
+int
+save_TSS_DAA_CREDENTIAL(FILE *file,
+ TSS_DAA_CREDENTIAL *credential)
+{
+ int i;
+ TSS_DAA_PK_internal *pk_internal;
+
+ fprintf(file, "%d # %s.length\n", credential->capitalALength, "capitalA");
+ fprintf(file, "%s\n", dump_byte_array( credential->capitalALength,
+ credential->capitalA));
+ fprintf(file, "%d # %s.length\n", credential->exponentLength, "exponent");
+ fprintf(file, "%s\n", dump_byte_array( credential->exponentLength,
+ credential->exponent));
+ fprintf(file, "%d # %s.length\n", credential->vBar0Length, "vBar0");
+ fprintf(file, "%s\n", dump_byte_array( credential->vBar0Length,
+ credential->vBar0));
+ fprintf(file, "%d # %s.length\n", credential->vBar1Length, "vBar1");
+ fprintf(file, "%s\n", dump_byte_array( credential->vBar1Length,
+ credential->vBar1));
+ fprintf(file, "%d # %s\n", credential->attributesLength, "attributesLength");
+ for( i=0; i < (int)credential->attributesLength; i++) {
+ fprintf(file, "%s\n", dump_byte_array( DAA_PARAM_SIZE_F_I / 8,
+ credential->attributes[i]));
+ }
+ pk_internal = e_2_i_TSS_DAA_PK( &(credential->issuerPK) );
+ save_DAA_PK_internal( file, pk_internal);
+ free_TSS_DAA_PK_internal( pk_internal);
+ fprintf(file, "%d # %s.length\n", credential->tpmSpecificEncLength, "tpmSpecificEnc");
+ fprintf(file, "%s\n", dump_byte_array( credential->tpmSpecificEncLength,
+ credential->tpmSpecificEnc));
+ fprintf(file, "%d # daaCounter\n", credential->daaCounter);
+ return 0;
+}
+#endif
+/********************************************************************************************
+ TPM_DAA_ISSUER
+********************************************************************************************/
+
+void
+free_TPM_DAA_ISSUER(TPM_DAA_ISSUER *tpm_daa_issuer)
+{
+ free(tpm_daa_issuer);
+}