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