xref: /netbsd-src/crypto/external/cpl/trousers/dist/src/tspi/daa/daa_anonymityrevocation/csencryption_result.c (revision 2d5f7628c5531eb583b9313ac2fd1cf8582b4479)
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 #include "daa_parameter.h"
12 #include "daa_structs.h"
13 #include "anonymity_revocation.h"
14 #include "verifier.h"
15 #include "tsplog.h"
16 
create_CS_ENCRYPTION_RESULT(bi_ptr c1,bi_ptr c2,bi_ptr c3,bi_ptr c4)17 CS_ENCRYPTION_RESULT *create_CS_ENCRYPTION_RESULT(
18 	bi_ptr c1,
19 	bi_ptr c2,
20 	bi_ptr c3,
21 	bi_ptr c4
22 ) {
23 	CS_ENCRYPTION_RESULT *result =
24 		(CS_ENCRYPTION_RESULT *)malloc( sizeof(CS_ENCRYPTION_RESULT));
25 
26 	if (result == NULL) {
27 		LogError("malloc of %d bytes failed", sizeof(CS_ENCRYPTION_RESULT));
28 		return NULL;
29 	}
30 	result->c1 = c1;
31 	result->c2 = c2;
32 	result->c3 = c3;
33 	result->c4 = c4;
34 	return result;
35 }
36 
create_CS_ENCRYPTION_RESULT_RANDOMNESS(CS_ENCRYPTION_RESULT * cs_encryption_result,bi_ptr randomness)37 CS_ENCRYPTION_RESULT_RANDOMNESS *create_CS_ENCRYPTION_RESULT_RANDOMNESS(
38 	CS_ENCRYPTION_RESULT *cs_encryption_result,
39 	bi_ptr randomness
40 ) {
41 	CS_ENCRYPTION_RESULT_RANDOMNESS *result =
42 		(CS_ENCRYPTION_RESULT_RANDOMNESS *)
43 			malloc(sizeof(CS_ENCRYPTION_RESULT_RANDOMNESS));
44 
45 	if (result == NULL) {
46 		LogError("malloc of %d bytes failed",
47 			sizeof(CS_ENCRYPTION_RESULT_RANDOMNESS));
48 		return NULL;
49 	}
50 	result->randomness = randomness;
51 	result->result = cs_encryption_result;
52 	return result;
53 }
54 
compute_u(const EVP_MD * digest,const bi_ptr c1,const bi_ptr c2,const bi_ptr c3,const BYTE * condition,const int conditionLength)55 bi_ptr compute_u( const EVP_MD *digest,
56 		const bi_ptr c1,
57 		const bi_ptr c2,
58 		const bi_ptr c3,
59 		const BYTE *condition,
60 		const int conditionLength
61 ) {
62 	BYTE *buffer, *bytes;
63 	int c1_size = bi_nbin_size( c1);
64 	int c2_size = bi_nbin_size( c2);
65 	int c3_size = bi_nbin_size( c3);
66 	int index = 0;
67 	int length;
68 	bi_ptr value;
69 	int bufferLength = c1_size + c2_size + c3_size + conditionLength;
70 
71 	buffer = (BYTE *)malloc( bufferLength);
72 	if (buffer == NULL) {
73 		LogError("malloc of %d bytes failed", bufferLength);
74 		return NULL;
75 	}
76 	bi_2_byte_array( &buffer[index], c1_size, c1);
77 	index += c1_size;
78 	bi_2_byte_array( &buffer[index], c2_size, c2);
79 	index += c2_size;
80 	bi_2_byte_array( &buffer[index], c3_size, c3);
81 	index += c3_size;
82 	memcpy( &buffer[index], condition, conditionLength);
83 	index += conditionLength;
84 	length = DAA_PARAM_LENGTH_MFG1_ANONYMITY_REVOCATION / 8; // 25 /8
85 	bytes = compute_bytes( bufferLength, buffer, length, digest);
86 	if( bytes == NULL) return NULL;
87 	value = bi_set_as_nbin( length, bytes);
88 	free( bytes);
89 	free( buffer);
90 	return value;
91 }
92 
internal_compute_encryption_proof(const bi_ptr msg,const bi_ptr delta1,const bi_ptr delta2,const bi_ptr delta3,const bi_ptr randomness,const CS_PUBLIC_KEY * key,const struct tdTSS_DAA_PK_internal * daa_key,const BYTE * condition,const int conditionLength,const EVP_MD * digest)93 CS_ENCRYPTION_RESULT_RANDOMNESS* internal_compute_encryption_proof(
94 	const bi_ptr msg,
95 	const bi_ptr delta1,
96 	const bi_ptr delta2,
97 	const bi_ptr delta3,
98 	const bi_ptr randomness,
99 	const CS_PUBLIC_KEY *key,
100 	const struct tdTSS_DAA_PK_internal *daa_key,
101 	const BYTE *condition,
102 	const int conditionLength,
103 	const EVP_MD *digest
104 ) {
105 	bi_ptr modulus = daa_key->modulus;
106 	bi_ptr gamma = daa_key->gamma;
107 	bi_ptr c1 = bi_new_ptr( );
108 	bi_ptr c2 = bi_new_ptr( );
109 	bi_ptr c3 = bi_new_ptr( );
110 	bi_ptr c4;
111 	bi_ptr exp;
112 	bi_t bi_tmp;
113 	bi_t bi_tmp1;
114 
115 	bi_new( bi_tmp);
116 	bi_new( bi_tmp1);
117 	if( bi_cmp( msg, modulus) >= 0) {
118 		LogError("IllegalArgument: msg to big for key size");
119 		bi_free_ptr( c1);
120 		bi_free_ptr( c2);
121 		bi_free_ptr( c3);
122 		bi_free( bi_tmp);
123 		bi_free( bi_tmp1);
124 		return NULL;
125 	}
126 	bi_mod_exp( c1, gamma, randomness, modulus);
127 	bi_mod_exp( c2, key->eta, randomness, modulus);
128 	// c3=msg * (key->lambda3 ^ randomness) % mopdulus)
129 	bi_mul( c3, msg, bi_mod_exp( bi_tmp, key->lambda3, randomness, modulus));
130 	bi_mod( c3, c3, modulus);	// c3 = c3 % modulus
131 	if( delta1 != NULL) {
132 		if( !( delta2!=NULL && delta3!=NULL)) {
133 			LogError("Illegal Arguments: delta2==NULL or delta3==NULL");
134 			bi_free_ptr( c1);
135 			bi_free_ptr( c2);
136 			bi_free_ptr( c3);
137 			bi_free( bi_tmp);
138 			bi_free( bi_tmp1);
139 			return NULL;
140 		}
141 		exp = compute_u( digest, delta1, delta2, delta3, condition, conditionLength);
142 	} else {
143 		if( !( delta2==NULL && delta3==NULL)) {
144 			LogError("Illegal Arguments: delta2!=NULL or delta3!=NULL");
145 			bi_free_ptr( c1);
146 			bi_free_ptr( c2);
147 			bi_free_ptr( c3);
148 			bi_free( bi_tmp);
149 			bi_free( bi_tmp1);
150 			return NULL;
151 		}
152 		exp = compute_u( digest, c1, c2, c3, condition, conditionLength);
153 	}
154 	// exp = exp * randomness
155 	bi_mul( exp, exp, randomness);
156 	// exp = exp % daa_key->rho
157 	bi_mod( exp, exp, daa_key->rho);
158 	// bi_tmp = (key->lambda1 ^ randomness) % modulus
159 	bi_mod_exp( bi_tmp, key->lambda1, randomness, modulus);
160 	// bi_tmp1 = (key->lambda2 ^ exp) % modulus
161 	bi_mod_exp( bi_tmp1, key->lambda2, exp, modulus);
162 	c4 = bi_new_ptr();
163 	// c4 = bi_tmp * bi_tmp1
164 	bi_mul( c4, bi_tmp, bi_tmp1);
165 	// c4 = c4 % modulus
166 	bi_mod( c4, c4, modulus);
167 	bi_free_ptr( exp);
168 	bi_free( bi_tmp1);
169 	bi_free( bi_tmp);
170 	return create_CS_ENCRYPTION_RESULT_RANDOMNESS(
171 		create_CS_ENCRYPTION_RESULT( c1, c2, c3, c4),
172 		randomness);
173 }
174 
175 /*
176 Cramer-Shoup EncryptionProof
177 from com.ibm.zurich.tcg.daa.anonymityrevocation.CSEncryptionProof
178  */
compute_ecryption_proof(const bi_ptr msg,const bi_ptr delta1,const bi_ptr delta2,const bi_ptr delta3,const bi_ptr randomness,const CS_PUBLIC_KEY * key,const struct tdTSS_DAA_PK_internal * daa_key,const BYTE * condition,const int conditionLength,const EVP_MD * digest)179 CS_ENCRYPTION_RESULT_RANDOMNESS *compute_ecryption_proof(
180 	const bi_ptr msg,
181 	const bi_ptr delta1,
182 	const bi_ptr delta2,
183 	const bi_ptr delta3,
184 	const bi_ptr randomness,
185 	const CS_PUBLIC_KEY *key,
186 	const struct tdTSS_DAA_PK_internal *daa_key,
187 	const BYTE *condition,
188 	const int conditionLength,
189 	const EVP_MD *digest
190 ) {
191 	if( delta1 == NULL || delta2 == NULL || delta3 == NULL) {
192 		LogError("Illegal Argument: deltas (delta1:%ld delta2:%ld delta3:%ld)",
193 				(long)delta1, (long)delta2, (long)delta3);
194 		return NULL;
195 	}
196 	if( bi_cmp( randomness, daa_key->rho) >=0 || bi_cmp_si( randomness, 0) < 0) {
197 		LogError("randomness >= rho || randomness < 0 \n\trandomness:%s\n\trho:%s\n",
198 				bi_2_dec_char( randomness), bi_2_dec_char( daa_key->rho));
199 		return NULL;
200 	}
201 	return internal_compute_encryption_proof( msg,
202 						delta1,
203 						delta2,
204 						delta3,
205 						randomness,
206 						key,
207 						daa_key,
208 						condition,
209 						conditionLength,
210 						digest);
211 }
212