1 
2 /*
3 * Licensed Materials - Property of IBM
4 *
5 * trousers - An open source TCG Software Stack
6 *
7 * (C) Copyright International Business Machines Corp. 2006
8 *
9 */
10 
11 /*
12 This file implements Helper functions for converting / creating and freeing
13 internal representation of TSS_DAA structures.
14 An external representation is the one define in tss_structs.h.
15 An internal representation is using bi_t or bi_ptr for representing big numbers.
16 Naming convention: for each structures we can have:
17 init_(<STRUCT>, struct *) : initialize the version field
18 create_<STRUCT> : init all fields
19 free_<STRUCT> :  free all fields
20 e_2_i_<STRUCT> : convertor from External representation to internal
21 i_2_e_<STRUCT> : convertor from Internal to External. This call use a given memory
22 allocation function, to allow
23 for 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) \
35 do { \
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)  \
43 do { \
44 	store_bi( &pk->field##Length, &pk->field, bi); \
45 } while(0);
46 
47 #define STORE_DAA_PK_BI( field, daa_alloc, param_alloc)  \
48 do { \
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
58 static char buffer[1000];
59 #endif
convert_alloc(TCS_CONTEXT_HANDLE tcsContext,UINT32 length,BYTE * source)60 BYTE *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 
copy_alloc(TCS_CONTEXT_HANDLE tcsContext,UINT32 length,BYTE * source)69 BYTE *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 
normal_malloc(size_t size,TSS_HOBJECT object)77 static 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 */
store_bi(UINT32 * length,BYTE ** buffer,const bi_ptr i,void * (* daa_alloc)(size_t size,TSS_HOBJECT object),TSS_HOBJECT object)83 void 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 
get_bi(const unsigned long n_length,const BYTE * buffer)100 bi_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 */
dump_field(int length,BYTE * buffer)113 void 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 */
124 char *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  */
143 int 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
161 internal_2_DAA_SELECTED_ATTRIB
162 * and DAA_SELECTED_ATTRIB_2_internal will change the struct to be internal or
163 external
164 ********************************************************************************************/
165 
i_2_e_TSS_DAA_SELECTED_ATTRIB(TSS_DAA_SELECTED_ATTRIB * selected_attrib)166 void i_2_e_TSS_DAA_SELECTED_ATTRIB(
167 	TSS_DAA_SELECTED_ATTRIB *selected_attrib
168 ) {
169 }
170 
e_2_i_TSS_DAA_SELECTED_ATTRIB(TSS_DAA_SELECTED_ATTRIB * selected_attrib)171 void e_2_i_TSS_DAA_SELECTED_ATTRIB(
172 	TSS_DAA_SELECTED_ATTRIB *selected_attrib
173 ) {
174 }
175 
176 /* work ONLY with internal format
177 important: TSS_BOOL is of type int_8_t, so a char, if the size is bigger, we
178 will maybe need
179 to transform each part to big indian ? or maybe each part is false if equal to
180 0, true otherwise.
181 */
to_bytes_TSS_DAA_SELECTED_ATTRIB_internal(int * result_length,TSS_DAA_SELECTED_ATTRIB * selected_attrib)182 BYTE *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 /*
201 create a TSS_DAA_SELECTED_ATTRIB of length <length> with given selected attributes.
202 example of selections of the second and third attributes upon 5:
203 create_TSS_DAA_SELECTED_ATTRIB( &selected_attrib, 5, 0, 1, 1, 0, 0);
204 */
create_TSS_DAA_SELECTED_ATTRIB(TSS_DAA_SELECTED_ATTRIB * attrib,int length,...)205 void 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 
i_2_e_TSS_DAA_SIGN_DATA(TSS_DAA_SIGN_DATA * sign_data)226 void i_2_e_TSS_DAA_SIGN_DATA( TSS_DAA_SIGN_DATA *sign_data) {
227 }
228 
e_2_i_TSS_DAA_SIGN(TSS_DAA_SIGN_DATA * sign_data)229 void e_2_i_TSS_DAA_SIGN( TSS_DAA_SIGN_DATA *sign_data) {
230 }
231 
232 /********************************************************************************************
233 *   TSS_DAA_ATTRIB_COMMIT
234 ********************************************************************************************/
235 
create_TSS_DAA_ATTRIB_COMMIT(bi_ptr beta,bi_ptr sMu)236 TSS_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 
250 TSS_DAA_PSEUDONYM_PLAIN_internal *
create_TSS_DAA_PSEUDONYM_PLAIN(bi_ptr nV)251 create_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 */
268 DAA_PRIVATE_KEY_internal *
create_TSS_DAA_PRIVATE_KEY(bi_ptr pPrime,bi_ptr qPrime)269 create_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
282 int
283 save_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 
291 DAA_PRIVATE_KEY_internal *
292 load_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
e_2_i_TSS_DAA_PRIVATE_KEY(TSS_DAA_PRIVATE_KEY * private_key)306 DAA_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 
320 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)321 i_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 
357 int
358 save_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 
368 KEY_PAIR_WITH_PROOF_internal *
369 load_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 */
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)383 TSS_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() */
408 void
populate_capitalY(TSS_DAA_PK_internal * pk_internal)409 populate_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 
425 void
compute_capitalSprime(TSS_DAA_PK_internal * pk_internal)426 compute_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 */
441 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)442 create_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 
484 int
485 save_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 
513 TSS_DAA_PK_internal *
514 load_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
551 void
dump_DAA_PK_internal(char * name,TSS_DAA_PK_internal * pk_internal)552 dump_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 */
574 BYTE *
encoded_DAA_PK_internal(int * result_length,const TSS_DAA_PK_internal * pk)575 encoded_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 */
655 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)656 i_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 /**/
721 TSS_DAA_PK_internal *
e_2_i_TSS_DAA_PK(TSS_DAA_PK * pk)722 e_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 
773 void
free_TSS_DAA_PK_internal(TSS_DAA_PK_internal * pk_internal)774 free_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 */
793 void
free_TSS_DAA_PK(TSS_DAA_PK * pk)794 free_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 
817 TPM_DAA_ISSUER *
convert2issuer_settings(TSS_DAA_PK_internal * pk_internal)818 convert2issuer_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 
886 BYTE *
issuer_2_byte_array(TPM_DAA_ISSUER * tpm_daa_issuer,int * length)887 issuer_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 */
921 TSS_DAA_PK_PROOF_internal *
create_DAA_PK_PROOF(BYTE * const challenge,const int length_challenge,bi_array_ptr * response,const int length_response)922 create_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
941 int
942 save_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) */
964 TSS_DAA_PK_PROOF_internal *
965 load_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 
988 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)989 i_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 
1030 TSS_DAA_PK_PROOF_internal *
e_2_i_TSS_DAA_PK_PROOF(TSS_DAA_PK_PROOF * pk_proof)1031 e_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 
1068 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)1069 create(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 
1100 TSS_DAA_SIGNATURE_internal*
e_2_i_TSS_DAA_SIGNATURE(TSS_DAA_SIGNATURE * signature)1101 e_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 
1132 void
free_TSS_DAA_SIGNATURE_internal(TSS_DAA_SIGNATURE_internal * signature)1133 free_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 
1152 TSS_DAA_CRED_ISSUER *
1153 load_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 
1187 int
1188 save_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 
1221 TSS_DAA_CREDENTIAL *
1222 load_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 
1275 int
1276 save_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 
1313 void
free_TPM_DAA_ISSUER(TPM_DAA_ISSUER * tpm_daa_issuer)1314 free_TPM_DAA_ISSUER(TPM_DAA_ISSUER *tpm_daa_issuer)
1315 {
1316 	free(tpm_daa_issuer);
1317 }
1318