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/* 12This file implements Helper functions for converting / creating and freeing 13internal representation of TSS_DAA structures. 14An external representation is the one define in tss_structs.h. 15An internal representation is using bi_t or bi_ptr for representing big numbers. 16Naming convention: for each structures we can have: 17init_(<STRUCT>, struct *) : initialize the version field 18create_<STRUCT> : init all fields 19free_<STRUCT> : free all fields 20e_2_i_<STRUCT> : convertor from External representation to internal 21i_2_e_<STRUCT> : convertor from Internal to External. This call use a given memory 22allocation function, to allow 23for example to use calloc_tspi, or a "normal" malloc. 24*/ 25#include <stdio.h> 26#include <strings.h> 27#include <errno.h> 28#include <strings.h> 29 30#include "daa_parameter.h" 31#include "daa_structs.h" 32#include "tcslog.h" 33 34#define DUMP_DAA_PK_FIELD( field) \ 35do { \ 36 printf("%s=", #field); \ 37 dump_field( pk->field##Length, pk->field); \ 38 puts(""); \ 39} while(0); 40 41#if 0 42#define STORE_DAA_PK_BI1( field, bi) \ 43do { \ 44 store_bi( &pk->field##Length, &pk->field, bi); \ 45} while(0); 46 47#define STORE_DAA_PK_BI( field, daa_alloc, param_alloc) \ 48do { \ 49 store_bi( &pk->field##Length,\ 50 &pk->field,\ 51 pk_internal->field,\ 52 daa_alloc,\ 53 param_alloc); \ 54} while(0); 55 56// used only to read a structure from a file, so only as helping function 57// for TCG application 58static char buffer[1000]; 59#endif 60BYTE *convert_alloc( TCS_CONTEXT_HANDLE tcsContext, UINT32 length, BYTE *source) { 61 BYTE *result = calloc_tspi( tcsContext, length); 62 63 if( result == NULL) return NULL; 64 memcpy( result, source, length); 65 free( source); 66 return result; 67} 68 69BYTE *copy_alloc( TCS_CONTEXT_HANDLE tcsContext, UINT32 length, BYTE *source) { 70 BYTE *result = calloc_tspi( tcsContext, length); 71 72 if( result == NULL) return NULL; 73 memcpy( result, source, length); 74 return result; 75} 76 77static void *normal_malloc( size_t size, TSS_HOBJECT object) { 78 void *ret = malloc( size); 79 return ret; 80} 81 82/* store a bi to a buffer and update the length in big endian format */ 83void store_bi( UINT32 *length, 84 BYTE **buffer, 85 const bi_ptr i, 86 void * (*daa_alloc)(size_t size, TSS_HOBJECT object), 87 TSS_HOBJECT object 88) { 89 int size; 90 91 *buffer = (BYTE *)daa_alloc( bi_length( i), object); 92 bi_2_nbin1( &size, *buffer, i); 93 *length = size; 94 LogDebug( "[store_bi] host_length:%d network_length:%d[address:%d]\n", 95 size, 96 (int)*length, 97 (int)*buffer); 98} 99 100bi_ptr get_bi( const unsigned long n_length, const BYTE *buffer) { 101 unsigned long length; 102 103 length = n_length; 104 LogDebug( "[get_bi] %d [address:%d -> |%2x|%2x| ]\n", 105 (int)length, 106 (int)buffer, 107 (int)(buffer[0] &0xFF), 108 (int)(buffer[1]&0xFF)); 109 return bi_set_as_nbin( length, buffer); 110} 111 112/* length is in network format: big indian */ 113void dump_field( int length, BYTE *buffer) { 114 int i; 115 116 for( i=0; i< length; i++) { 117 BYTE byte = (BYTE)(buffer[i] & 0xFF); 118 printf("%02X", byte); 119 } 120} 121 122#if 0 123/* !: do not keep the return buffer */ 124char *read_str(FILE *file) { 125 int i; 126 char c; 127 128 fgets( buffer, 1000, file); 129 i=0; 130 while( buffer[i] =='\n' || buffer[i]=='\r' || buffer[i]==' ') i++; 131 do { 132 c = buffer[ i++]; 133 } while( c != 0 && c != ' ' && c!='\n' && c!='\r' && c!='#'); 134 buffer[ i -1] = 0; 135 return buffer; 136} 137 138/** 139 * 140 * @param file 141 * @return 142 */ 143int read_int( FILE *file) { 144 int i, ret; 145 char c; 146 147 fgets( buffer, 1000, file); 148 i=0; 149 while( buffer[i] =='\n' || buffer[i]=='\r' || buffer[i]==' ') i++; 150 do { 151 c = buffer[ i++]; 152 } while( c != 0 && c != ' ' && c!='\n' && c!='\r' && c!='#'); 153 buffer[ i -1] = 0; 154 sscanf( buffer, "%d", &ret); 155 return ret; 156} 157#endif 158/******************************************************************************************** 159* TSS_DAA_SELECTED_ATTRIB 160* this struct is used internally and externally, only a call to 161internal_2_DAA_SELECTED_ATTRIB 162* and DAA_SELECTED_ATTRIB_2_internal will change the struct to be internal or 163external 164********************************************************************************************/ 165 166void i_2_e_TSS_DAA_SELECTED_ATTRIB( 167 TSS_DAA_SELECTED_ATTRIB *selected_attrib 168) { 169} 170 171void e_2_i_TSS_DAA_SELECTED_ATTRIB( 172 TSS_DAA_SELECTED_ATTRIB *selected_attrib 173) { 174} 175 176/* work ONLY with internal format 177important: TSS_BOOL is of type int_8_t, so a char, if the size is bigger, we 178will maybe need 179to transform each part to big indian ? or maybe each part is false if equal to 1800, true otherwise. 181*/ 182BYTE *to_bytes_TSS_DAA_SELECTED_ATTRIB_internal( 183 int *result_length, 184 TSS_DAA_SELECTED_ATTRIB *selected_attrib 185) { 186 BYTE *result; 187 int index = 0; 188 unsigned int length = selected_attrib->indicesListLength; 189 190 *result_length = sizeof(unsigned int) + 191 (selected_attrib->indicesListLength * sizeof(TSS_BOOL)); 192 result = (BYTE *)malloc( *result_length); 193 memcpy( &result[index], &length, sizeof(UINT32)); 194 index+=sizeof(UINT32); 195 memcpy( &result[index], selected_attrib->indicesList, 196 sizeof(TSS_BOOL) * selected_attrib->indicesListLength); 197 return result; 198} 199 200/* 201create a TSS_DAA_SELECTED_ATTRIB of length <length> with given selected attributes. 202example of selections of the second and third attributes upon 5: 203create_TSS_DAA_SELECTED_ATTRIB( &selected_attrib, 5, 0, 1, 1, 0, 0); 204*/ 205void create_TSS_DAA_SELECTED_ATTRIB( TSS_DAA_SELECTED_ATTRIB *attrib, int length, ...) { 206 va_list ap; 207 int i, select; 208 209 attrib->indicesListLength = length; 210 attrib->indicesList = (TSS_BOOL *)malloc( length * sizeof( TSS_BOOL)); 211 va_start (ap, length); 212 for( i=0; i<length; i++) { 213 select = va_arg( ap, int) != 0; 214 attrib->indicesList[i] = select; 215 } 216 va_end (ap); 217} 218 219 220/****************************************************************************************** 221* TSS_DAA_SIGN_DATA 222* this struct is used internally and externally, only a call to internal_2_DAA_SIGN_DATA 223* DAA_SIGN_DATA_2_internal will change the struct to be internal or external 224*******************************************************************************************/ 225 226void i_2_e_TSS_DAA_SIGN_DATA( TSS_DAA_SIGN_DATA *sign_data) { 227} 228 229void e_2_i_TSS_DAA_SIGN( TSS_DAA_SIGN_DATA *sign_data) { 230} 231 232/******************************************************************************************** 233* TSS_DAA_ATTRIB_COMMIT 234********************************************************************************************/ 235 236TSS_DAA_ATTRIB_COMMIT_internal *create_TSS_DAA_ATTRIB_COMMIT( bi_ptr beta, bi_ptr sMu) { 237 TSS_DAA_ATTRIB_COMMIT_internal *result = 238 (TSS_DAA_ATTRIB_COMMIT_internal *)malloc( sizeof(TSS_DAA_ATTRIB_COMMIT_internal)); 239 240 result->beta = beta; 241 result->sMu = sMu; 242 return result; 243} 244 245 246/******************************************************************************************** 247* TSS_DAA_PSEUDONYM_PLAIN 248********************************************************************************************/ 249 250TSS_DAA_PSEUDONYM_PLAIN_internal * 251create_TSS_DAA_PSEUDONYM_PLAIN(bi_ptr nV) 252{ 253 TSS_DAA_PSEUDONYM_PLAIN_internal *result = (TSS_DAA_PSEUDONYM_PLAIN_internal *) 254 malloc(sizeof(TSS_DAA_PSEUDONYM_PLAIN_internal)); 255 256 result->nV = nV; 257 return result; 258} 259 260/******************************************************************************************** 261* DAA PRIVATE KEY 262********************************************************************************************/ 263/* 264* allocate: ret->p_prime 265* ret->q_prime 266* ret->productPQprime 267*/ 268DAA_PRIVATE_KEY_internal * 269create_TSS_DAA_PRIVATE_KEY(bi_ptr pPrime, bi_ptr qPrime) 270{ 271 DAA_PRIVATE_KEY_internal *private_key = 272 (DAA_PRIVATE_KEY_internal *)malloc( sizeof( DAA_PRIVATE_KEY_internal)); 273 274 private_key->p_prime = bi_new_ptr(); bi_set( private_key->p_prime, pPrime); 275 private_key->q_prime = bi_new_ptr(); bi_set( private_key->q_prime, qPrime); 276 private_key->productPQprime = bi_new_ptr(); 277 bi_mul( private_key->productPQprime, pPrime, qPrime); 278 return private_key; 279} 280 281#if 0 282int 283save_DAA_PRIVATE_KEY(FILE *file, const DAA_PRIVATE_KEY_internal *private_key) 284{ 285 BI_SAVE( private_key->p_prime , file); 286 BI_SAVE( private_key->q_prime , file); 287 BI_SAVE( private_key->productPQprime, file); 288 return 0; 289} 290 291DAA_PRIVATE_KEY_internal * 292load_DAA_PRIVATE_KEY(FILE *file) 293{ 294 DAA_PRIVATE_KEY_internal *private_key = 295 (DAA_PRIVATE_KEY_internal *)malloc( sizeof(DAA_PRIVATE_KEY_internal)); 296 297 private_key->p_prime = bi_new_ptr(); 298 BI_LOAD( private_key->p_prime, file); 299 private_key->q_prime = bi_new_ptr(); 300 BI_LOAD( private_key->q_prime, file); 301 private_key->productPQprime = bi_new_ptr(); 302 BI_LOAD( private_key->productPQprime, file); 303 return private_key; 304} 305#endif 306DAA_PRIVATE_KEY_internal *e_2_i_TSS_DAA_PRIVATE_KEY(TSS_DAA_PRIVATE_KEY *private_key) { 307 DAA_PRIVATE_KEY_internal *private_key_internal; 308 309 LogDebug("-> e_2_i_TSS_DAA_PRIVATE_KEY"); 310 private_key_internal = 311 (DAA_PRIVATE_KEY_internal *)malloc( sizeof(DAA_PRIVATE_KEY_internal)); 312 private_key_internal->p_prime = get_bi( private_key->p_primeLength, private_key->p_prime); 313 private_key_internal->q_prime = get_bi( private_key->q_primeLength, private_key->q_prime); 314 private_key_internal->productPQprime = 315 get_bi( private_key->productPQprimeLength, private_key->productPQprime); 316 LogDebug("<- e_2_i_TSS_DAA_PRIVATE_KEY"); 317 return private_key_internal; 318} 319 320TSS_DAA_PRIVATE_KEY * 321i_2_e_TSS_DAA_PRIVATE_KEY(DAA_PRIVATE_KEY_internal *private_key_internal, 322 void * (*daa_alloc)(size_t size, TSS_HOBJECT object), 323 TSS_HOBJECT param_alloc) 324{ 325 TSS_DAA_PRIVATE_KEY *result; 326 327 LogDebug("-> i_2_e_TSS_DAA_PRIVATE_KEY"); 328 result = (TSS_DAA_PRIVATE_KEY *)daa_alloc( sizeof(TSS_DAA_PRIVATE_KEY), param_alloc); 329 init_tss_version( result); 330 store_bi( &(result->p_primeLength), 331 &(result->p_prime), 332 private_key_internal->p_prime, 333 daa_alloc, 334 param_alloc); 335 store_bi( &(result->q_primeLength), 336 &(result->q_prime), 337 private_key_internal->q_prime, 338 daa_alloc, 339 param_alloc); 340 store_bi( &(result->productPQprimeLength), 341 &(result->productPQprime), 342 private_key_internal->productPQprime, 343 daa_alloc, 344 param_alloc); 345 LogDebug("<- i_2_e_TSS_DAA_PRIVATE_KEY"); 346 return result; 347} 348 349/******************************************************************************************** 350* KEY PAIR WITH PROOF 351********************************************************************************************/ 352 353#if 0 354 355/* moved to daa_debug.c */ 356 357int 358save_KEY_PAIR_WITH_PROOF(FILE *file, 359 KEY_PAIR_WITH_PROOF_internal *key_pair_with_proof) 360{ 361 save_DAA_PK_internal( file, key_pair_with_proof->pk); 362 save_DAA_PRIVATE_KEY( file, key_pair_with_proof->private_key); 363 save_DAA_PK_PROOF_internal( file, key_pair_with_proof->proof); 364 365 return 0; 366} 367 368KEY_PAIR_WITH_PROOF_internal * 369load_KEY_PAIR_WITH_PROOF(FILE *file) 370{ 371 KEY_PAIR_WITH_PROOF_internal *key_pair_with_proof = 372 (KEY_PAIR_WITH_PROOF_internal *)malloc(sizeof(KEY_PAIR_WITH_PROOF_internal)); 373 374 key_pair_with_proof->pk = load_DAA_PK_internal(file); 375 key_pair_with_proof->private_key = load_DAA_PRIVATE_KEY(file); 376 key_pair_with_proof->proof = load_DAA_PK_PROOF_internal(file); 377 378 return key_pair_with_proof; 379} 380 381#endif 382/* allocated using instrumented daa_alloc */ 383TSS_DAA_KEY_PAIR *get_TSS_DAA_KEY_PAIR(KEY_PAIR_WITH_PROOF_internal *key_pair_with_proof, 384 void * (*daa_alloc)(size_t size, TSS_HOBJECT object), 385 TSS_HOBJECT param_alloc) 386{ 387 TSS_DAA_KEY_PAIR *result; 388 389 LogDebug("-> i_2_e_KEY_PAIR_WITH_PROOF"); 390 391 result = (TSS_DAA_KEY_PAIR *)daa_alloc(sizeof(TSS_DAA_KEY_PAIR), param_alloc); 392 init_tss_version(result); 393 result->private_key = i_2_e_TSS_DAA_PRIVATE_KEY(key_pair_with_proof->private_key, 394 daa_alloc, param_alloc); 395 result->public_key = i_2_e_TSS_DAA_PK( key_pair_with_proof->pk, daa_alloc, param_alloc); 396 397 LogDebug("<- i_2_e_KEY_PAIR_WITH_PROOF"); 398 399 return result; 400} 401 402 403/******************************************************************************************** 404* TSS_DAA_PK 405********************************************************************************************/ 406 407/* pk_internal->capitalY must be alocated using ALLOC_BI_ARRAY() */ 408void 409populate_capitalY(TSS_DAA_PK_internal *pk_internal) 410{ 411 int i; 412 413 bi_new_array(pk_internal->capitalY, 414 pk_internal->capitalRReceiver->length + pk_internal->capitalRIssuer->length); 415 416 // CAPITAL Y ( capitalRReceiver ) 417 for (i = 0; i < pk_internal->capitalRReceiver->length; i++) 418 pk_internal->capitalY->array[i] = pk_internal->capitalRReceiver->array[i]; 419 // CAPITAL Y ( capitalRIssuer) 420 for (i = 0; i < pk_internal->capitalRIssuer->length; i++) 421 pk_internal->capitalY->array[pk_internal->capitalRReceiver->length+i] = 422 pk_internal->capitalRIssuer->array[i]; 423} 424 425void 426compute_capitalSprime(TSS_DAA_PK_internal *pk_internal) 427{ 428 bi_t bi_tmp; 429 430 bi_new(bi_tmp); 431 pk_internal->capitalSprime = bi_new_ptr(); 432 bi_shift_left( bi_tmp, bi_1, DAA_PARAM_SIZE_SPLIT_EXPONENT); 433 bi_mod_exp(pk_internal->capitalSprime, pk_internal->capitalS, bi_tmp, pk_internal->modulus); 434 bi_free( bi_tmp); 435} 436 437/* 438* create anf feel a TSS_DAA_PK_internal structures 439* ! this function keep pointer on all parameters 440*/ 441TSS_DAA_PK_internal * 442create_DAA_PK(const bi_ptr modulus, 443 const bi_ptr capitalS, 444 const bi_ptr capitalZ, 445 const bi_ptr capitalR0, 446 const bi_ptr capitalR1, 447 const bi_ptr gamma, 448 const bi_ptr capitalGamma, 449 const bi_ptr rho, 450 const bi_array_ptr capitalRReceiver, 451 const bi_array_ptr capitalRIssuer, 452 const int issuerBaseNameLength, 453 BYTE * const issuerBaseName) 454{ 455 TSS_DAA_PK_internal *pk_internal; 456 457 LogDebug("-> create_DAA_PK"); 458 pk_internal = (TSS_DAA_PK_internal *)malloc(sizeof(TSS_DAA_PK_internal)); 459 pk_internal->modulus = modulus; 460 pk_internal->capitalS = capitalS; 461 pk_internal->capitalZ = capitalZ; 462 pk_internal->capitalR0 = capitalR0; 463 pk_internal->capitalR1 = capitalR1; 464 pk_internal->gamma = gamma; 465 pk_internal->capitalGamma = capitalGamma; 466 pk_internal->rho = rho; 467 pk_internal->capitalRReceiver = capitalRReceiver; 468 pk_internal->capitalRIssuer = capitalRIssuer; 469 pk_internal->capitalY = ALLOC_BI_ARRAY(); 470 populate_capitalY( pk_internal); 471 pk_internal->issuerBaseNameLength = issuerBaseNameLength; 472 pk_internal->issuerBaseName = issuerBaseName; 473 compute_capitalSprime( pk_internal); 474 475 LogDebug("<- create_DAA_PK"); 476 477 return pk_internal; 478} 479 480#if 0 481 482/* moved to daa_debug.c */ 483 484int 485save_DAA_PK_internal(FILE *file, const TSS_DAA_PK_internal *pk_internal) 486{ 487 char *buffer; 488 489 LogDebug("-> save_DAA_PK_internal"); 490 491 BI_SAVE( pk_internal->modulus, file); 492 BI_SAVE( pk_internal->capitalS, file); 493 BI_SAVE( pk_internal->capitalZ, file); 494 BI_SAVE( pk_internal->capitalR0, file); 495 BI_SAVE( pk_internal->capitalR1, file); 496 BI_SAVE( pk_internal->gamma, file); 497 BI_SAVE( pk_internal->capitalGamma, file); 498 BI_SAVE( pk_internal->rho, file); 499 BI_SAVE_ARRAY( pk_internal->capitalRReceiver, file); 500 BI_SAVE_ARRAY( pk_internal->capitalRIssuer, file); 501 fprintf( file, "%d\n", pk_internal->issuerBaseNameLength); 502 buffer = (char *)malloc( pk_internal->issuerBaseNameLength + 1); 503 memcpy( buffer, pk_internal->issuerBaseName, pk_internal->issuerBaseNameLength); 504 buffer[ pk_internal->issuerBaseNameLength] = 0; 505 fprintf( file, "%s\n", buffer); 506 free( buffer); 507 508 LogDebug("<- save_DAA_PK_internal"); 509 510 return 0; 511} 512 513TSS_DAA_PK_internal * 514load_DAA_PK_internal(FILE *file) 515{ 516 TSS_DAA_PK_internal *pk_internal = 517 (TSS_DAA_PK_internal *)malloc(sizeof(TSS_DAA_PK_internal)); 518 char *read_buffer; 519 520 pk_internal->modulus = bi_new_ptr(); 521 BI_LOAD( pk_internal->modulus, file); 522 pk_internal->capitalS = bi_new_ptr(); 523 BI_LOAD( pk_internal->capitalS, file); 524 pk_internal->capitalZ = bi_new_ptr(); 525 BI_LOAD( pk_internal->capitalZ, file); 526 pk_internal->capitalR0 = bi_new_ptr(); 527 BI_LOAD( pk_internal->capitalR0, file); 528 pk_internal->capitalR1 = bi_new_ptr(); 529 BI_LOAD( pk_internal->capitalR1, file); 530 pk_internal->gamma = bi_new_ptr(); 531 BI_LOAD( pk_internal->gamma, file); 532 pk_internal->capitalGamma = bi_new_ptr(); 533 BI_LOAD( pk_internal->capitalGamma, file); 534 pk_internal->rho = bi_new_ptr(); 535 BI_LOAD( pk_internal->rho, file); 536 pk_internal->capitalRReceiver = ALLOC_BI_ARRAY(); 537 BI_LOAD_ARRAY( pk_internal->capitalRReceiver, file); 538 pk_internal->capitalRIssuer = ALLOC_BI_ARRAY(); 539 BI_LOAD_ARRAY( pk_internal->capitalRIssuer, file); 540 pk_internal->capitalY = ALLOC_BI_ARRAY(); 541 populate_capitalY( pk_internal); 542 pk_internal->issuerBaseNameLength = read_int( file); 543 read_buffer = read_str( file); 544 pk_internal->issuerBaseName = malloc( pk_internal->issuerBaseNameLength); 545 memcpy( pk_internal->issuerBaseName, read_buffer, pk_internal->issuerBaseNameLength); 546 compute_capitalSprime( pk_internal); 547 return pk_internal; 548} 549 550#endif 551void 552dump_DAA_PK_internal(char *name, TSS_DAA_PK_internal *pk_internal) 553{ 554 LogDebug("Dump TSS_DAA_PK_internal:%s\n", name); 555 556 DUMP_BI( pk_internal->modulus); 557 DUMP_BI( pk_internal->capitalS); 558 DUMP_BI( pk_internal->capitalZ); 559 DUMP_BI( pk_internal->capitalR0); 560 DUMP_BI( pk_internal->capitalR1); 561 DUMP_BI( pk_internal->gamma); 562 DUMP_BI( pk_internal->capitalGamma); 563 DUMP_BI( pk_internal->rho); 564 DUMP_BI_ARRAY( pk_internal->capitalRReceiver); 565 DUMP_BI_ARRAY( pk_internal->capitalRIssuer); 566 567 LogDebug("issuerBaseName = %s\n", pk_internal->issuerBaseName); 568 LogDebug("End Dump TSS_DAA_PK_internal:%s\n", name); 569} 570 571/* 572* Encode the DAA_PK like java.security.Key#getEncoded 573*/ 574BYTE * 575encoded_DAA_PK_internal(int *result_length, const TSS_DAA_PK_internal *pk) 576{ 577 int length_issuer_base_name = pk->issuerBaseNameLength; 578 int total_length = DAA_PARAM_TSS_VERSION_LENGTH + 579 5 * ((DAA_PARAM_SIZE_RSA_MODULUS / 8)+ sizeof(int)) + 580 2 * ((DAA_PARAM_SIZE_MODULUS_GAMMA / 8)+sizeof(int)) + 581 1 * ((DAA_PARAM_SIZE_RHO / 8)+sizeof(int)) + 582 pk->capitalY->length*(((DAA_PARAM_SIZE_RSA_MODULUS / 8)+sizeof(int))) 583 + length_issuer_base_name; 584 BYTE *result = (BYTE *)malloc(total_length); 585 int i, index = 0, length, big_indian_length; 586 587 if (result == NULL) 588 return NULL; 589 590 LogDebug("total_length=%d", total_length); 591 for (index = 0; index < DAA_PARAM_TSS_VERSION_LENGTH; index++) 592 result[index] = DAA_PARAM_TSS_VERSION[index]; 593 // n, capitalS, capitalZ, capitalR0, capitalR1 594 length = DAA_PARAM_SIZE_RSA_MODULUS / 8; 595 big_indian_length = length; 596 memcpy(&result[index], &big_indian_length, sizeof(int)); 597 index += sizeof(int); 598 bi_2_byte_array( &result[index], length, pk->modulus); 599 index += length; 600 memcpy(&result[index], &big_indian_length, sizeof(int)); 601 index += sizeof(int); 602 bi_2_byte_array( &result[index], length, pk->capitalS); 603 index += length; 604 memcpy(&result[index], &big_indian_length, sizeof(int)); 605 index += sizeof(int); 606 bi_2_byte_array( &result[index], length, pk->capitalZ); 607 index += length; 608 memcpy(&result[index], &big_indian_length, sizeof(int)); 609 index += sizeof(int); 610 bi_2_byte_array( &result[index], length, pk->capitalR0); 611 index += length; 612 memcpy(&result[index], &big_indian_length, sizeof(int)); 613 index += sizeof(int); 614 bi_2_byte_array( &result[index], length, pk->capitalR1); 615 index += length; 616 // gamma, capitalGamma 617 length = DAA_PARAM_SIZE_MODULUS_GAMMA / 8; 618 big_indian_length = length; 619 memcpy(&result[index], &big_indian_length, sizeof(int)); 620 index += sizeof(int); 621 bi_2_byte_array( &result[index], length, pk->gamma); 622 index += length; 623 memcpy(&result[index], &big_indian_length, sizeof(int)); 624 index += sizeof(int); 625 bi_2_byte_array( &result[index], length, pk->capitalGamma); 626 index += length; 627 // rho 628 length = DAA_PARAM_SIZE_RHO / 8; 629 big_indian_length = length; 630 memcpy(&result[index], &big_indian_length, sizeof(int)); 631 index += sizeof(int); 632 bi_2_byte_array( &result[index], length, pk->rho); 633 index += length; 634 // capitalY 635 length = DAA_PARAM_SIZE_RSA_MODULUS / 8; 636 big_indian_length = length; 637 638 for( i=0; i<pk->capitalY->length; i++) { 639 memcpy( &result[index], &big_indian_length, sizeof(int)); 640 index+=sizeof(int); 641 bi_2_byte_array( &result[index], length, pk->capitalY->array[i]); 642 index+=length; 643 } 644 // basename 645 memcpy( &result[index], pk->issuerBaseName, length_issuer_base_name); 646 index+=length_issuer_base_name; 647 *result_length = index; 648 649 LogDebug("return length=%d", index); 650 651 return result; 652} 653 654/* create anf feel a TSS_DAA_PK structures */ 655TSS_DAA_PK * 656i_2_e_TSS_DAA_PK(TSS_DAA_PK_internal *pk_internal, 657 void *(*daa_alloc)(size_t size, TSS_HOBJECT param_alloc), 658 TSS_HOBJECT param_alloc) 659{ 660 int i; 661 int capitalYLength; 662 int capitalYLength2; 663 TSS_DAA_PK *pk; 664 665 LogDebug("-> i_2_e_TSS_DAA_PK"); 666 pk = (TSS_DAA_PK *)daa_alloc( sizeof(TSS_DAA_PK), param_alloc); 667 init_tss_version( pk); 668 if (pk == NULL) { 669 LogError("Can not allocate the TSS_DAA_PK structure"); 670 return NULL; 671 } 672 STORE_DAA_PK_BI( modulus, daa_alloc, param_alloc); 673 STORE_DAA_PK_BI( capitalS, daa_alloc, param_alloc); 674 STORE_DAA_PK_BI( capitalZ, daa_alloc, param_alloc); 675 STORE_DAA_PK_BI( capitalR0, daa_alloc, param_alloc); 676 STORE_DAA_PK_BI( capitalR1, daa_alloc, param_alloc); 677 STORE_DAA_PK_BI( gamma, daa_alloc, param_alloc); 678 STORE_DAA_PK_BI( capitalGamma, daa_alloc, param_alloc); 679 STORE_DAA_PK_BI( rho, daa_alloc, param_alloc); 680 capitalYLength = pk_internal->capitalY->length; 681 capitalYLength2 = bi_nbin_size( pk_internal->capitalY->array[0]); 682 LogDebug("[capitalYLength=%d capitalYLength2=%d total size=%d]\n", 683 capitalYLength, capitalYLength2, sizeof(BYTE) * capitalYLength * 684 capitalYLength2); 685 pk->capitalY = (BYTE **) daa_alloc( sizeof(BYTE *) * capitalYLength, param_alloc ); 686 for (i = 0; i < capitalYLength; i++) { 687 if( bi_nbin_size( pk_internal->capitalY->array[i]) != capitalYLength2) { 688 // LOG ERROR 689 LogError("Error during feel operation of capitalY (index=%d capitalYLength" 690 "2=%d, currentSize=%d)\n", i, capitalYLength2, 691 (int)bi_nbin_size(pk_internal->capitalY->array[i])); 692 } 693 BYTE *buffer = (BYTE*) daa_alloc( sizeof(BYTE) * capitalYLength2, param_alloc); 694 bi_2_byte_array( buffer, capitalYLength2, pk_internal->capitalY->array[i]); 695 // bi_2_nbin1( &checkSize, buffer, pk_internal->capitalY->array[i]); 696 pk->capitalY[i] = buffer; 697 LogDebug( "[i=%d currentsize=%d buffer[%d]=[%2x|%2x]\n", 698 i, 699 (int)bi_nbin_size( pk_internal->capitalY->array[i]), 700 (int)pk->capitalY[i], 701 (int)pk->capitalY[i][0], 702 (int)pk->capitalY[i][1]); 703 } 704 pk->capitalYLength = capitalYLength; 705 pk->capitalYLength2 = capitalYLength2; 706 pk->capitalYPlatformLength = pk_internal->capitalRReceiver->length; 707 LogDebug("issuer= len=%d", pk_internal->issuerBaseNameLength); 708 pk->issuerBaseNameLength = pk_internal->issuerBaseNameLength; 709 pk->issuerBaseName = (BYTE *)daa_alloc(pk_internal->issuerBaseNameLength, param_alloc); 710 memcpy( pk->issuerBaseName, 711 pk_internal->issuerBaseName, 712 pk_internal->issuerBaseNameLength); 713 LogDebug("i_2_e_TSS_DAA_PK extern_issuer=%s intern_issuer=%s\n", 714 pk->issuerBaseName, 715 pk_internal->issuerBaseName); 716 LogDebug("<- i_2_e_TSS_DAA_PK"); 717 return pk; 718} 719 720/**/ 721TSS_DAA_PK_internal * 722e_2_i_TSS_DAA_PK( TSS_DAA_PK *pk) 723{ 724 TSS_DAA_PK_internal *pk_internal = 725 (TSS_DAA_PK_internal *)malloc(sizeof(TSS_DAA_PK_internal)); 726 unsigned long capitalYLength, capitalYLength2, capitalYPlatformLength; 727 UINT32 i; 728 int issuer_length; 729 730 // pk_internal->modulus = GET_DAA_PK_BI( modulus); 731 pk_internal->modulus = get_bi(pk->modulusLength, pk->modulus); 732 pk_internal->capitalS = get_bi(pk->capitalSLength, pk->capitalS); 733 pk_internal->capitalZ = get_bi(pk->capitalZLength, pk->capitalZ); 734 pk_internal->capitalR0 = get_bi(pk->capitalR0Length, pk->capitalR0); 735 pk_internal->capitalR1 = get_bi(pk->capitalR1Length, pk->capitalR1); 736 pk_internal->gamma = get_bi(pk->gammaLength, pk->gamma); 737 pk_internal->capitalGamma = get_bi(pk->capitalGammaLength, pk->capitalGamma); 738 pk_internal->rho = get_bi(pk->rhoLength, pk->rho); 739 capitalYLength = pk->capitalYLength; 740 capitalYLength2= pk->capitalYLength2; 741 capitalYPlatformLength = pk->capitalYPlatformLength; 742 LogDebug( "capitalYLength:%ld capitalYLength2:%ld capitalYPlatformLength:%ld\n", 743 capitalYLength, capitalYLength2, capitalYPlatformLength); 744 745 pk_internal->capitalRReceiver = ALLOC_BI_ARRAY(); 746 bi_new_array2(pk_internal->capitalRReceiver, capitalYPlatformLength); 747 for (i = 0; i < capitalYPlatformLength; i++) { 748 LogDebug( "i=%d\n", i); 749 pk_internal->capitalRReceiver->array[i] = 750 get_bi(pk->capitalYLength2, pk->capitalY[i]); 751 } 752 pk_internal->capitalRIssuer = ALLOC_BI_ARRAY(); 753 bi_new_array2( pk_internal->capitalRIssuer, capitalYLength - 754 capitalYPlatformLength); 755 for( ; i<capitalYLength; i++) { 756 pk_internal->capitalRIssuer->array[ i - capitalYPlatformLength] = 757 get_bi( pk->capitalYLength2, pk->capitalY[i]); 758 } 759 pk_internal->capitalY = ALLOC_BI_ARRAY(); 760 populate_capitalY( pk_internal); 761 issuer_length = pk->issuerBaseNameLength; 762 pk_internal->issuerBaseNameLength = issuer_length; 763 LogDebug( "issuer_length=%d\n", issuer_length); 764 pk_internal->issuerBaseName = (BYTE *)malloc( issuer_length); 765 memcpy( pk_internal->issuerBaseName, pk->issuerBaseName, issuer_length); 766 LogDebug("e_2_i_TSS_DAA_PK extern_issuer=%s intern_issuer=%s\n", 767 pk->issuerBaseName, 768 pk_internal->issuerBaseName); 769 compute_capitalSprime( pk_internal); // allocation 770 return pk_internal; 771} 772 773void 774free_TSS_DAA_PK_internal(TSS_DAA_PK_internal *pk_internal) 775{ 776 bi_free_ptr( pk_internal->capitalSprime); 777 free( pk_internal->issuerBaseName); 778 free( pk_internal->capitalY); 779 bi_free_array( pk_internal->capitalRIssuer); 780 bi_free_array( pk_internal->capitalRReceiver); 781 bi_free_ptr( pk_internal->rho); 782 bi_free_ptr( pk_internal->capitalGamma); 783 bi_free_ptr( pk_internal->gamma); 784 bi_free_ptr( pk_internal->capitalR1); 785 bi_free_ptr( pk_internal->capitalR0); 786 bi_free_ptr( pk_internal->capitalZ); 787 bi_free_ptr( pk_internal->capitalS); 788 bi_free_ptr( pk_internal->modulus); 789 free( pk_internal); 790} 791 792/* free a TSS_DAA_PK structures */ 793void 794free_TSS_DAA_PK(TSS_DAA_PK *pk) 795{ 796 int i; 797 798 LogDebug("-> free_TSS_DAA_PK"); 799 free( pk->modulus); 800 free( pk->capitalS); 801 free( pk->capitalZ); 802 free( pk->capitalR0); 803 free( pk->capitalR1); 804 free( pk->gamma); 805 free( pk->capitalGamma); 806 free( pk->rho); 807 for( i=0; i<(int)pk->capitalYLength; i++) { 808 free( pk->capitalY[i]); 809 } 810 free( pk->capitalY); 811 free( pk->issuerBaseName); 812 free( pk); 813 LogDebug("<- free_TSS_DAA_PK"); 814 815} 816 817TPM_DAA_ISSUER * 818convert2issuer_settings(TSS_DAA_PK_internal *pk_internal) 819{ 820 TPM_DAA_ISSUER *result = (TPM_DAA_ISSUER *)malloc(sizeof(TPM_DAA_ISSUER)); 821 EVP_MD_CTX *mdctx; 822 UINT32 length; 823 BYTE *array = (BYTE*)malloc((DAA_PARAM_SIZE_RSA_MODULUS+7)/8); 824 825 LogDebug("convert2issuer_settings"); 826 EVP_MD_CTX_create(mdctx); 827 // TAG 828 result->tag = htons( TPM_TAG_DAA_ISSUER); 829 // capitalR0 830 EVP_DigestInit(mdctx, DAA_PARAM_get_message_digest()); 831 832 EVP_DigestInit_ex(mdctx, DAA_PARAM_get_message_digest(), NULL); 833 bi_2_byte_array( array, 834 length = (bi_length( pk_internal->capitalR0)+7)/8, 835 pk_internal->capitalR0); 836 LogDebug("capitalR0 length=%d", length); 837 EVP_DigestUpdate(mdctx, array, length); 838 EVP_DigestFinal_ex(mdctx, (BYTE *)&(result->DAA_digest_R0), NULL); 839 // capitalR1 840 EVP_DigestInit_ex(mdctx, DAA_PARAM_get_message_digest(), NULL); 841 bi_2_byte_array( array, 842 length = (bi_length( pk_internal->capitalR1)+7)/8, 843 pk_internal->capitalR1); 844 LogDebug("capitalR1 length=%d", length); 845 EVP_DigestUpdate(mdctx, array, length); 846 EVP_DigestFinal_ex(mdctx, (BYTE *)&(result->DAA_digest_R1), NULL); 847 // capitalS (S0) 848 EVP_DigestInit_ex(mdctx, DAA_PARAM_get_message_digest(), NULL); 849 bi_2_byte_array( array, 850 length = (bi_length( pk_internal->capitalS)+7)/8, 851 pk_internal->capitalS); 852 LogDebug("capitalS length=%d", length); 853 EVP_DigestUpdate(mdctx, array, length); 854 EVP_DigestFinal_ex(mdctx, (BYTE *)&(result->DAA_digest_S0), NULL); 855 // capitalSprime (S1) 856 EVP_DigestInit_ex(mdctx, DAA_PARAM_get_message_digest(), NULL); 857 bi_2_byte_array( array, 858 length = (bi_length( pk_internal->capitalSprime)+7)/8, 859 pk_internal->capitalSprime); 860 LogDebug("capitalSprime length=%d", length); 861 EVP_DigestUpdate(mdctx, array, length); 862 EVP_DigestFinal_ex(mdctx, (BYTE *)&(result->DAA_digest_S1), NULL); 863 // modulus (n) 864 EVP_DigestInit_ex(mdctx, DAA_PARAM_get_message_digest(), NULL); 865 bi_2_byte_array( array, 866 length = (bi_length( pk_internal->modulus)+7)/8, 867 pk_internal->modulus); 868 LogDebug("modulus length=%d", length); 869 EVP_DigestUpdate(mdctx, array, length); 870 EVP_DigestFinal_ex(mdctx, (BYTE *)&(result->DAA_digest_n), NULL); 871 // modulus (n) 872 EVP_DigestInit_ex(mdctx, DAA_PARAM_get_message_digest(), NULL); 873 bi_2_byte_array( array, 874 length = (bi_length( pk_internal->capitalGamma)+7)/8, 875 pk_internal->capitalGamma); 876 LogDebug("capitalGamma length=%d", length); 877 EVP_DigestUpdate(mdctx, array, length); 878 free(array); 879 EVP_DigestFinal_ex(mdctx, (BYTE *)&(result->DAA_digest_gamma), NULL); 880 EVP_MD_CTX_destroy(mdctx); 881 // rho 882 bi_2_byte_array( (BYTE *)&(result->DAA_generic_q), 26, pk_internal->rho); 883 return result; 884} 885 886BYTE * 887issuer_2_byte_array(TPM_DAA_ISSUER *tpm_daa_issuer, int *length) 888{ 889 UINT32 size = sizeof(UINT16) + ( 6 * TPM_SHA1_160_HASH_LEN) + 26; 890 BYTE * result = (BYTE *)malloc( sizeof(BYTE)*size); 891 UINT32 i = 0; 892 893 memcpy( &result[i], &(tpm_daa_issuer->tag), sizeof(UINT16)); 894 i+=sizeof(UINT16); 895 memcpy( &result[i], &(tpm_daa_issuer->DAA_digest_R0), TPM_SHA1_160_HASH_LEN); 896 i+=TPM_SHA1_160_HASH_LEN; 897 memcpy( &result[i], &(tpm_daa_issuer->DAA_digest_R1), TPM_SHA1_160_HASH_LEN); 898 i+=TPM_SHA1_160_HASH_LEN; 899 memcpy( &result[i], &(tpm_daa_issuer->DAA_digest_S0), TPM_SHA1_160_HASH_LEN); 900 i+=TPM_SHA1_160_HASH_LEN; 901 memcpy( &result[i], &(tpm_daa_issuer->DAA_digest_S1), TPM_SHA1_160_HASH_LEN); 902 i+=TPM_SHA1_160_HASH_LEN; 903 memcpy( &result[i], &(tpm_daa_issuer->DAA_digest_n), TPM_SHA1_160_HASH_LEN); 904 i+=TPM_SHA1_160_HASH_LEN; 905 memcpy( &result[i], &(tpm_daa_issuer->DAA_digest_gamma), TPM_SHA1_160_HASH_LEN); 906 i+=TPM_SHA1_160_HASH_LEN; 907 memcpy( &result[i], &(tpm_daa_issuer->DAA_generic_q), 26); 908 *length = size; 909 return result; 910} 911 912/******************************************************************************************** 913* TSS_DAA_PK_PROOF 914********************************************************************************************/ 915 916/* 917* this function keep references on: 918* - challenge (BYTE *) 919* - response (bi_array_ptr *) 920*/ 921TSS_DAA_PK_PROOF_internal * 922create_DAA_PK_PROOF(BYTE* const challenge, 923 const int length_challenge, 924 bi_array_ptr *response, 925 const int length_response) 926{ 927 TSS_DAA_PK_PROOF_internal *pk_proof; 928 929#ifdef DAA_DEBUG 930 printf("create_DAA_PK_PROOF_internal\n"); 931#endif 932 pk_proof = (TSS_DAA_PK_PROOF_internal *)malloc( sizeof(TSS_DAA_PK_PROOF_internal)); 933 pk_proof->challenge = challenge; 934 pk_proof->length_challenge = length_challenge; 935 pk_proof->response = response; 936 pk_proof->length_response = length_response; 937 return pk_proof; 938} 939 940#if 0 941int 942save_DAA_PK_PROOF_internal(FILE *file, TSS_DAA_PK_PROOF_internal *proof) 943{ 944 int i; 945 946#ifdef DAA_DEBUG 947 printf("save_DAA_PK_PROOF_internal"); 948#endif 949 fprintf(file, "%d # %s.length\n", proof->length_challenge, "challenge"); 950 fprintf(file, "%s\n", dump_byte_array( proof->length_challenge, 951 proof->challenge)); 952 fprintf(file, "%d # %s.length\n", proof->length_response, "response"); 953 for (i = 0; i < proof->length_response; i++) { 954 BI_SAVE_ARRAY( proof->response[i], file); 955 } 956 957 return 0; 958} 959 960/* load <proof> using <filename> */ 961/* allocation of: */ 962/* proof->challenge (BYTE*) */ 963/* response (bi_array_ptr) */ 964TSS_DAA_PK_PROOF_internal * 965load_DAA_PK_PROOF_internal(FILE *file) 966{ 967 TSS_DAA_PK_PROOF_internal *proof = 968 (TSS_DAA_PK_PROOF_internal *)malloc(sizeof(TSS_DAA_PK_PROOF_internal)); 969 char *read_buffer; 970 int i; 971 972#ifdef DAA_DEBUG 973 printf("load_DAA_PK_PROOF_internal"); 974#endif 975 proof->length_challenge = read_int( file); 976 read_buffer = read_str( file); 977 proof->challenge = retrieve_byte_array( &(proof->length_challenge),read_buffer); 978 proof->length_response = read_int( file); 979 proof->response = (bi_array_ptr *)malloc( sizeof(bi_array_ptr) * proof->length_response); 980 for (i = 0; i < proof->length_response; i++) { 981 proof->response[i] = ALLOC_BI_ARRAY(); 982 BI_LOAD_ARRAY( proof->response[i], file); 983 } 984 return proof; 985} 986#endif 987 988TSS_DAA_PK_PROOF * 989i_2_e_TSS_DAA_PK_PROOF(TSS_DAA_PK_PROOF_internal*pk_internal_proof, 990 void * (*daa_alloc)(size_t size, TSS_HOBJECT param), 991 TSS_HOBJECT param_alloc) 992{ 993 TSS_DAA_PK_PROOF *pk_proof = 994 (TSS_DAA_PK_PROOF *)daa_alloc( sizeof(TSS_DAA_PK_PROOF), param_alloc); 995 int i, j; 996 int length_response2; 997 int length_response3; 998 999 init_tss_version( pk_proof); 1000 // CHALLENGE 1001 pk_proof->challengeLength = pk_internal_proof->length_challenge; 1002 pk_proof->challenge = (BYTE *)daa_alloc( pk_internal_proof->length_challenge, 1003 param_alloc); 1004 memcpy( pk_proof->challenge, pk_internal_proof->challenge, 1005 pk_internal_proof->length_challenge); 1006 // RESPONSES 1007 pk_proof->responseLength = pk_internal_proof->length_response; 1008 length_response2 = pk_internal_proof->response[0]->length; 1009 pk_proof->responseLength2 = length_response2; 1010 length_response3 = bi_nbin_size( 1011 pk_internal_proof->response[0]->array[0]); 1012 if( length_response3 & 1) length_response3++; // length_response3 should be paire 1013 pk_proof->responseLength3 = length_response3; 1014 pk_proof->response = (BYTE ***)daa_alloc( sizeof(BYTE **) * 1015 pk_internal_proof->length_response, param_alloc); 1016 for(i = 0; i < pk_internal_proof->length_response; i++) { 1017 pk_proof->response[i] = (BYTE **)daa_alloc( sizeof(BYTE *) * length_response2, 1018 param_alloc); 1019 for( j = 0; j < length_response2; j++) { 1020 (pk_proof->response[i])[j] = (BYTE *)malloc( 1021 sizeof(BYTE) * length_response3); 1022 bi_2_byte_array( pk_proof->response[i][j], 1023 length_response3, 1024 pk_internal_proof->response[i]->array[j]); 1025 } 1026 } 1027 return pk_proof; 1028} 1029 1030TSS_DAA_PK_PROOF_internal * 1031e_2_i_TSS_DAA_PK_PROOF(TSS_DAA_PK_PROOF *pk_proof) 1032{ 1033 int i, j, response_length2; 1034 TSS_DAA_PK_PROOF_internal *pk_proof_internal = 1035 (TSS_DAA_PK_PROOF_internal *)malloc( sizeof( TSS_DAA_PK_PROOF_internal)); 1036 1037 // CHALLENGE 1038 pk_proof_internal->length_challenge = pk_proof->challengeLength; 1039#ifdef DAA_DEBUG 1040 fprintf(stderr, "issuer_length=%d\n", pk_proof_internal->length_challenge); 1041#endif 1042 pk_proof_internal->challenge = (BYTE *)malloc( pk_proof_internal->length_challenge); 1043 memcpy( pk_proof_internal->challenge, 1044 pk_proof->challenge, 1045 pk_proof_internal->length_challenge); 1046 // RESPONSES 1047 pk_proof_internal->length_response = pk_proof->responseLength; 1048 response_length2 = pk_proof->responseLength2; 1049 pk_proof_internal->response = 1050 (bi_array_ptr *)malloc( sizeof(bi_array_ptr) * 1051 pk_proof_internal->length_response); 1052 for(i = 0; i<pk_proof_internal->length_response; i++) { 1053 pk_proof_internal->response[i] = ALLOC_BI_ARRAY(); 1054 bi_new_array2( pk_proof_internal->response[i], response_length2); 1055 for( j = 0; j < response_length2; j++) { 1056 pk_proof_internal->response[i]->array[j] = 1057 get_bi( pk_proof->responseLength3, pk_proof->response[i][j]); 1058 } 1059 } 1060 return pk_proof_internal; 1061} 1062 1063 1064/******************************************************************************************** 1065* TSS_DAA_JOIN_ISSUER_SESSION 1066********************************************************************************************/ 1067 1068TSS_DAA_JOIN_ISSUER_SESSION_internal * 1069create(TSS_DAA_PK_PROOF_internal *issuerKeyPair, 1070 TPM_DAA_ISSUER *issuerAuthKey, 1071 TSS_DAA_IDENTITY_PROOF *identityProof, 1072 bi_ptr capitalUprime, 1073 int daaCounter, 1074 int nonceIssuerLength, 1075 BYTE *nonceIssuer, 1076 int nonceEncryptedLength, 1077 BYTE *nonceEncrypted) 1078{ 1079 TSS_DAA_JOIN_ISSUER_SESSION_internal *result = 1080 (TSS_DAA_JOIN_ISSUER_SESSION_internal *)malloc( 1081 sizeof(TSS_DAA_JOIN_ISSUER_SESSION_internal)); 1082 1083 result->issuerAuthKey = issuerAuthKey; 1084 result->issuerKeyPair = issuerKeyPair; 1085 result->identityProof = identityProof; 1086 result->capitalUprime = capitalUprime; 1087 result->daaCounter = daaCounter; 1088 result->nonceIssuerLength = nonceIssuerLength; 1089 result->nonceIssuer = nonceIssuer; 1090 result->nonceEncryptedLength = nonceEncryptedLength; 1091 result->nonceEncrypted = nonceEncrypted; 1092 return result; 1093} 1094 1095 1096/******************************************************************************************** 1097 * TSS_DAA_SIGNATURE 1098 ********************************************************************************************/ 1099 1100TSS_DAA_SIGNATURE_internal* 1101e_2_i_TSS_DAA_SIGNATURE(TSS_DAA_SIGNATURE* signature) 1102{ 1103 TSS_DAA_SIGNATURE_internal *signature_intern = 1104 (TSS_DAA_SIGNATURE_internal *)malloc( sizeof( TSS_DAA_SIGNATURE_internal)); 1105 int i, length; 1106 1107 signature_intern->zeta = bi_set_as_nbin( signature->zetaLength, signature->zeta); 1108 signature_intern->capitalT = bi_set_as_nbin( signature->capitalTLength, 1109 signature->capitalT); 1110 signature_intern->challenge_length = signature->challengeLength; 1111 signature_intern->challenge = (BYTE *)malloc( signature->challengeLength); 1112 memcpy( signature_intern->challenge, 1113 signature->challenge, 1114 signature->challengeLength); 1115 signature_intern->nonce_tpm_length = signature->nonceTpmLength; 1116 signature_intern->nonce_tpm = (BYTE *)malloc( signature->nonceTpmLength); 1117 memcpy( signature_intern->nonce_tpm, signature->nonceTpm, signature->nonceTpmLength); 1118 signature_intern->sV = bi_set_as_nbin( signature->sVLength, signature->sV); 1119 signature_intern->sF0 = bi_set_as_nbin( signature->sF0Length, signature->sF0); 1120 signature_intern->sF1 = bi_set_as_nbin( signature->sF1Length, signature->sF1); 1121 signature_intern->sE = bi_set_as_nbin( signature->sELength, signature->sE); 1122 signature_intern->sA = (bi_array_ptr)malloc( sizeof( bi_array)); 1123 bi_new_array2( signature_intern->sA, signature->sALength); 1124 length = ( DAA_PARAM_SIZE_RANDOMIZED_ATTRIBUTES + 7) / 8; 1125 for (i = 0; i < (int)signature->sALength; i++) { 1126 signature_intern->sA->array[i] = bi_set_as_nbin( length, signature->sA[i]); 1127 } 1128 1129 return signature_intern; 1130} 1131 1132void 1133free_TSS_DAA_SIGNATURE_internal(TSS_DAA_SIGNATURE_internal *signature) 1134{ 1135 bi_free_array( signature->sA); 1136 bi_free_ptr( signature->sE); 1137 bi_free_ptr( signature->sF1); 1138 bi_free_ptr( signature->sF0); 1139 bi_free_ptr( signature->sV); 1140 free( signature->nonce_tpm); 1141 free( signature->challenge); 1142 bi_free_ptr( signature->capitalT); 1143 bi_free_ptr( signature->zeta); 1144 free( signature); 1145} 1146 1147#if 0 1148/******************************************************************************************** 1149 TSS_DAA_CRED_ISSUER 1150********************************************************************************************/ 1151 1152TSS_DAA_CRED_ISSUER * 1153load_TSS_DAA_CRED_ISSUER(FILE *file) 1154{ 1155 TSS_DAA_CRED_ISSUER *credential = 1156 (TSS_DAA_CRED_ISSUER *)malloc(sizeof(TSS_DAA_CRED_ISSUER)); 1157 char *read_buffer; 1158 int i, len; 1159 1160 init_tss_version( credential); 1161 credential->capitalALength = read_int( file); 1162 read_buffer = read_str( file); 1163 credential->capitalA = retrieve_byte_array( &(credential->capitalALength), 1164 read_buffer); 1165 credential->eLength = read_int( file); 1166 read_buffer = read_str( file); 1167 credential->e = retrieve_byte_array( &(credential->eLength),read_buffer); 1168 credential->vPrimePrimeLength = read_int( file); 1169 read_buffer = read_str( file); 1170 credential->vPrimePrime = retrieve_byte_array(&(credential->vPrimePrimeLength), 1171 read_buffer); 1172 // attributes issuer 1173 credential->attributesIssuerLength = read_int( file); 1174 credential->attributesIssuer = malloc(credential->attributesIssuerLength*sizeof(BYTE*)); 1175 for( i=0; i < (int)credential->attributesIssuerLength; i++) { 1176 credential->attributesIssuer[i] = retrieve_byte_array( &len, read_buffer); 1177 } 1178 credential->cPrimeLength = read_int( file); 1179 read_buffer = read_str( file); 1180 credential->cPrime = retrieve_byte_array( &(credential->cPrimeLength),read_buffer); 1181 credential->sELength = read_int( file); 1182 read_buffer = read_str( file); 1183 credential->sE = retrieve_byte_array( &(credential->sELength),read_buffer); 1184 return credential; 1185} 1186 1187int 1188save_TSS_DAA_CRED_ISSUER(FILE *file, TSS_DAA_CRED_ISSUER *credential) 1189{ 1190 int i; 1191 1192 fprintf(file, "%d # %s.length\n", credential->capitalALength, "capitalA"); 1193 fprintf(file, "%s\n", dump_byte_array( credential->capitalALength, 1194 credential->capitalA)); 1195 fprintf(file, "%d # %s.length\n", credential->eLength, "e"); 1196 fprintf(file, "%s\n", dump_byte_array( credential->eLength, 1197 credential->e)); 1198 fprintf(file, "%d # %s.length\n", credential->vPrimePrimeLength, "vPrimePrime"); 1199 fprintf(file, "%s\n", dump_byte_array( credential->vPrimePrimeLength, 1200 credential->vPrimePrime)); 1201 fprintf(file, "%d # %s\n", credential->attributesIssuerLength, "attributesIssuerLength"); 1202 for( i=0; i < (int)credential->attributesIssuerLength; i++) { 1203 fprintf(file, "%s\n", dump_byte_array( DAA_PARAM_SIZE_F_I / 8, 1204 credential->attributesIssuer[i])); 1205 1206 } 1207 fprintf(file, "%d # %s.length\n", credential->cPrimeLength, "cPrime"); 1208 fprintf(file, "%s\n", dump_byte_array( credential->cPrimeLength, 1209 credential->cPrime)); 1210 fprintf(file, "%d # %s.length\n", credential->sELength, "sE"); 1211 fprintf(file, "%s\n", dump_byte_array( credential->sELength, 1212 credential->sE)); 1213 return 0; 1214} 1215 1216 1217/******************************************************************************************** 1218 TSS_DAA_CREDENTIAL 1219********************************************************************************************/ 1220 1221TSS_DAA_CREDENTIAL * 1222load_TSS_DAA_CREDENTIAL(FILE *file) 1223{ 1224 TSS_DAA_CREDENTIAL *credential = 1225 (TSS_DAA_CREDENTIAL *)malloc(sizeof(TSS_DAA_CREDENTIAL)); 1226 char *read_buffer; 1227 int i, len; 1228 TSS_DAA_PK_internal *pk_internal; 1229 TSS_DAA_PK *pk; 1230 1231 init_tss_version( credential); 1232 credential->capitalALength = read_int( file); 1233 read_buffer = read_str( file); 1234 credential->capitalA = retrieve_byte_array( &(credential->capitalALength), 1235 read_buffer); 1236 credential->exponentLength = read_int( file); 1237 read_buffer = read_str( file); 1238 credential->exponent = retrieve_byte_array( &(credential->exponentLength), 1239 read_buffer); 1240 credential->vBar0Length = read_int( file); 1241 read_buffer = read_str( file); 1242 credential->vBar0 = retrieve_byte_array(&(credential->vBar0Length), 1243 read_buffer); 1244 credential->vBar1Length = read_int( file); 1245 read_buffer = read_str( file); 1246 credential->vBar1 = retrieve_byte_array(&(credential->vBar1Length), 1247 read_buffer); 1248 // attributes issuer 1249 credential->attributesLength = read_int( file); 1250 printf("attributesLength=%d\n", credential->attributesLength); 1251 credential->attributes = malloc(credential->attributesLength * sizeof( BYTE *)); 1252 for( i=0; i < (int)credential->attributesLength; i++) { 1253 read_buffer = read_str( file); 1254 credential->attributes[i] = retrieve_byte_array( &len, read_buffer); 1255 if( len != DAA_PARAM_SIZE_F_I / 8) { 1256 LogError("Error when parsing attributes"); 1257 LogError("\tattribute length:%d", len); 1258 LogError("\texpected length:%d", DAA_PARAM_SIZE_F_I / 8); 1259 return NULL; 1260 } 1261 } 1262 pk_internal = load_DAA_PK_internal( file); 1263 pk = i_2_e_TSS_DAA_PK( pk_internal, &normal_malloc, (TSS_HOBJECT)NULL); 1264 memcpy( &(credential->issuerPK), pk, sizeof(TSS_DAA_PK)); 1265 free( pk); 1266 free_TSS_DAA_PK_internal( pk_internal); 1267 credential->tpmSpecificEncLength = read_int( file); 1268 read_buffer = read_str( file); 1269 credential->tpmSpecificEnc = retrieve_byte_array( &(credential->tpmSpecificEncLength), 1270 read_buffer); 1271 credential->daaCounter = read_int( file); 1272 return credential; 1273} 1274 1275int 1276save_TSS_DAA_CREDENTIAL(FILE *file, 1277 TSS_DAA_CREDENTIAL *credential) 1278{ 1279 int i; 1280 TSS_DAA_PK_internal *pk_internal; 1281 1282 fprintf(file, "%d # %s.length\n", credential->capitalALength, "capitalA"); 1283 fprintf(file, "%s\n", dump_byte_array( credential->capitalALength, 1284 credential->capitalA)); 1285 fprintf(file, "%d # %s.length\n", credential->exponentLength, "exponent"); 1286 fprintf(file, "%s\n", dump_byte_array( credential->exponentLength, 1287 credential->exponent)); 1288 fprintf(file, "%d # %s.length\n", credential->vBar0Length, "vBar0"); 1289 fprintf(file, "%s\n", dump_byte_array( credential->vBar0Length, 1290 credential->vBar0)); 1291 fprintf(file, "%d # %s.length\n", credential->vBar1Length, "vBar1"); 1292 fprintf(file, "%s\n", dump_byte_array( credential->vBar1Length, 1293 credential->vBar1)); 1294 fprintf(file, "%d # %s\n", credential->attributesLength, "attributesLength"); 1295 for( i=0; i < (int)credential->attributesLength; i++) { 1296 fprintf(file, "%s\n", dump_byte_array( DAA_PARAM_SIZE_F_I / 8, 1297 credential->attributes[i])); 1298 } 1299 pk_internal = e_2_i_TSS_DAA_PK( &(credential->issuerPK) ); 1300 save_DAA_PK_internal( file, pk_internal); 1301 free_TSS_DAA_PK_internal( pk_internal); 1302 fprintf(file, "%d # %s.length\n", credential->tpmSpecificEncLength, "tpmSpecificEnc"); 1303 fprintf(file, "%s\n", dump_byte_array( credential->tpmSpecificEncLength, 1304 credential->tpmSpecificEnc)); 1305 fprintf(file, "%d # daaCounter\n", credential->daaCounter); 1306 return 0; 1307} 1308#endif 1309/******************************************************************************************** 1310 TPM_DAA_ISSUER 1311********************************************************************************************/ 1312 1313void 1314free_TPM_DAA_ISSUER(TPM_DAA_ISSUER *tpm_daa_issuer) 1315{ 1316 free(tpm_daa_issuer); 1317} 1318