8
/* for the logging system used by TSS */
9
setenv("TCSD_FOREGROUND", "1", 1);
12
* standard bit length extension to obtain a uniformly distributed number
15
int test_exp_multi(void);
17
void foo (bi_t result, const bi_ptr param, unsigned long n) {
20
bi_set( result, param);
21
bi_mul_si( result, result, n);
22
for (i = 1; i < n; i++) bi_add_si( result, result, i*7);
25
void *my_malloc(size_t size) {
26
void *ret = malloc( size);
28
printf("my_malloc() -> %ld\n", (long)ret);
33
* Returns a random number in the range of [0,element-1].
38
* the secure random source
39
* @return the random number
41
void computeRandomNumber(bi_t res, const bi_ptr element) {
42
int length = 80 + bi_length( res); // give the length
43
bi_urandom( res, length); // res = random( of length);
44
int element_length = bi_length( element);
45
bi_mod_si( res, res, element_length); // res = res mod <number byte of element>
48
int main (int argc, char **argv) {
49
bi_t bi_tmp, bi_tmp1, bi_tmp2, bi_tmp3, bi_tmp4, bi_tmp5, bi_tmp6;
53
unsigned char result1[5];
57
unsigned char ret[] = { (unsigned char)1, 0, (unsigned char)254 };
59
unsigned char *buffer;
64
printf("test(%s,%s)\n", __DATE__, __TIME__);
66
printf("using BMP\n");
69
printf("using OPENSSL\n");
81
bi_set_as_hex( n, "75E8F38669C531EB78C7ACD62CCDEFFB5E5BE15E2AA55B3AD28B1A35F6E937097CE09A49C689AC335FBA669205CEF209275CFF273F8F81C5B864E5029EECDFA0743BC15D6E4D2C2CB0DED2DC7119A7E0D61669D417BB3B12BA1D10FD40326A49CA6C9E77F8585F25D8C897D9C73284152E103582C018C964F02ADDBA56CB1161A949AAE2847ADE8BC1152716C8B4AF37A87011C2569F646FD3EDA83099048B9525A6401C47A372F3EA43C91066AD5851AE11DEF1EAC7108FFB06AD94D0B849C339A5E8793C4C054456D3D22D30ACCCF7EF33EF7A7D65799E7908D95B0538A9EFC91BF104CE5008D79625394DB1E5883B2F202B95320BBD868BF65C996FC0DFC5");
82
bi_set_as_hex( r, "35A624E6607CFD37162C6052547450B2267ECC749F10CDAEB5C294491321EEB47CA0229F423ADCEF3FA7806F5C4DB3C3445D8E7039EBC457149A1343BECF3B1078385C06EE74351A476BE0D5203633C81F7B8D68548DB763F0C096B20615B6016C180291EF32CC064A173BB22F6B46B3240ACC0B50D8338757FA28D5B0313BC4201CD2B35472842E71994C8FCA557B08004B2495304D13A93D796134BB8078E2EE371707DE5809D72474A7CCE1F865ECD8876105D3DB9AFA9426052D0120C755C60F56A0C0F30FAED2053CEB3129FAB6F57F6E209A8E7B2A559D734B339E19E1F2A147BC94DB2FF491CB5ACCEEEED7F2EA75AFF7CAD33E1E420A09135D9C5C1F");
85
printf("big number n=n*r\n");
88
bi_set_as_hex( r, "D7E7028DA181DADAC29C95143C865702453465115AFA7576AADF1E57DD84DA7FF4C8F66530D1E9D1AB69BC12342B89FA0A9755F9F4EE1DA445D50016CEF50622ED905CC9B987FCC7910CAA841641814C1994BC442A15CB05FE5C145626F1454E90435FBC6A529856EF29BDBCBFCB62FB69EDBD11DC33357667867278E1679EABCDBEEA02E9A6911804DF47ACA6B2D63A31E258AD542D71A8178A5E072F5E221EADBB10E16D5533AE427101FF94C5967575FABCD18305C5F15C103CEA1A8ACD01898E88426EDA7C0DF58AA48435808A840F6EEE1D7205D33F356E20FE0D4136B401BF386F11869C3CE4A808B96435694748EF3706F58756548A71E4CF4D2BE157");
90
printf("mod big number n=n mod r\n");
92
if( bi_get_si( bi_set_as_si( n, 13)) != 13) {
93
printf("!!! bi_set_as_si 13(%s) = 13\n", bi_2_dec_char( n ));
96
if( bi_get_si( bi_set_as_si( n, -13)) != -13) {
97
printf("!!! bi_set_as_si -13(%s) = -13\n", bi_2_dec_char( n ));
100
if( bi_get_si( bi_inc(bi_set_as_si( n, 13))) != 14) {
101
puts("!!! bi_inc 13++ = 14\n");
104
if( bi_get_si( bi_dec(bi_set_as_si( n, 13))) != 12) {
105
puts("!!! bi_dec 13-- = 12\n");
108
if( bi_get_si( bi_setbit(bi_set_as_si( n, 0), 10)) != 1024) {
109
puts("!!! bi_setbit set[10] = 1024\n");
112
if( bi_get_si( bi_mod_si(bi_tmp, bi_set_as_si( n, 12), 10)) != 2) {
113
puts("!!! bi_mod_si 12 mod 10 = 2\n");
116
if( bi_get_si( bi_mul_si(bi_tmp, bi_set_as_si( n, 12), 10)) != 120) {
117
puts("!!! bi_mul_si 12 * 10 = 120\n");
120
if( bi_get_si( bi_mul(bi_tmp, bi_set_as_si( n, 12), bi_set_as_si( bi_tmp1, 10))) != 120) {
121
puts("!!! bi_mul_si 12 * 10 = 120\n");
124
if( bi_get_si( bi_mod_exp_si(bi_tmp, bi_set_as_si( bi_tmp1, 4), bi_2, 10)) != 6) {
125
puts("!!! bi_mod_exp_si 4 ^ 2 mod 10 = 6\n");
128
if( bi_get_si( bi_mod_exp(bi_tmp, bi_set_as_si( bi_tmp1, 4), bi_2, bi_set_as_si( bi_tmp2, 10))) != 6) {
129
puts("!!! bi_mod_exp 4 ^ 2 mod 10 = 6\n");
132
if( bi_get_si( bi_mod(bi_tmp, bi_set_as_si( n, 12), bi_set_as_si(bi_tmp1, 10))) != 2) { printf("!!! bi_mod 12 mod 10 = 2 [%s]\n",bi_2_dec_char( bi_tmp)); exit(-1); }
133
if( bi_get_si( bi_mod(bi_tmp, bi_set_as_si( n, -12), bi_set_as_si(bi_tmp1, 10))) != 8) { printf("!!! bi_mod -12 mod 10 = 8 [%s]\n",bi_2_dec_char( bi_tmp)); exit(-1); }
134
if( bi_get_si( bi_mod(bi_tmp, bi_set_as_si( n, -27), bi_set_as_si(bi_tmp1, 10))) != 3) { printf("!!! bi_mod -27 mod 10 = 3 [%s]\n",bi_2_dec_char( bi_tmp)); exit(-1); }
135
bi_set_as_si(n, 0x12345678);
136
bi_2_byte_array( result1, 5, n);
137
if( result1[0] != 0x00 || result1[1] != 0x12 || result1[2] != 0x34 || result1[3] != 0x56 || result1[4] != 0x78 ) {
138
printf("!!! bi_2_byte_array[0x123456578] [0]=%x [1]=%x [2]=%x [3]=%x [4]=%x \n", result1[0], result1[1], result1[2], result1[3], result1[4]);
141
byte_array = retrieve_byte_array( &len, "12345");
142
printf("test dump_byte_array len=%d \n", len);
143
printf("test dump_byte_array(\"12345\")=%s\n", dump_byte_array( len, byte_array));
145
byte_array = retrieve_byte_array( &len, "12345678");
146
printf("test dump_byte_array len=%d \n", len);
147
printf("test dump_byte_array(\"12345678\")=%s\n", dump_byte_array( len, byte_array));
149
// test save end load of bi_t and bi_array
150
/////////////////////////////////////////////////////////////////////////////////////
152
bi_new_array( result, 2);
153
bi_set_as_si( bi_tmp, 6);
154
bi_set_as_si( result->array[0], 314159);
155
bi_set_as_si( result->array[1], 123456789);
156
file = fopen("/tmp/test.todel", "w");
157
bi_save_array( result, "result", file);
158
bi_save( bi_tmp, "bi_tmp", file);
160
bi_set_as_si( result->array[0], 0);
161
bi_set_as_si( result->array[1], 0);
162
bi_set_as_si( bi_tmp, 0);
163
file = fopen("/tmp/test.todel", "r");
164
bi_load_array( result, file);
165
bi_load( bi_tmp, file);
167
if( bi_get_si( result->array[0]) != 314159) { puts("!!! save/load array[0] = 314159\n"); exit(-1); }
168
if( bi_get_si( result->array[1]) != 123456789) { puts("!!! save/load array[1] = 123456789\n"); exit(-1); }
169
if( bi_get_si( bi_tmp) != 6) { puts("!!! save/load bi_tmp = 6\n"); exit(-1); }
171
// conversion from bi_t 2 big endian BYTE*
172
/////////////////////////////////////////////////////////////////////////////////////
173
bi_set_as_si( n, 254+(1 << 16));
174
buffer = bi_2_nbin( &length, n);
175
printf("value 2 convert=%s length=%ld\n", bi_2_hex_char( n), bi_nbin_size( n));
176
for( i=0; i<length; i++) {
177
byte = (unsigned char)(buffer[i] & 0xFF);
178
if( byte != ret[i]) { printf("\n!!! bi_2_nbin[%d] %x = %x\n", i, byte, ret[i]); exit(-1); }
179
printf("[buffer[%d]=%x]", i, (int)(byte));
182
nn = bi_set_as_nbin( length, buffer);
183
if( bi_equals_si( nn, 254+(1 << 16) ) == 0) {
184
printf("\n!!! bi_set_as_nbin %s = %x\n", bi_2_hex_char( nn), 254+(1 << 16));
187
if( !bi_equals( bi_sub_si( bi_tmp, bi_set_as_si( bi_tmp1, 9), 1),
189
bi_mul( bi_tmp3, bi_set_as_si(bi_tmp4, 6),
190
bi_set_as_si( bi_tmp5, 3)),
191
bi_set_as_si( bi_tmp6, 10)))) {
192
puts("!!! 9-1 == (6*3) mod 10\n");
193
printf("!!! tmp(8) = %s tmp1(9)=%s tmp2(8)=%s tmp3(6*3)=%s tmp4(6)=%s\
194
tmp5(3)=%s tmp6(10)=%s\n",
195
bi_2_dec_char(bi_tmp),
196
bi_2_dec_char(bi_tmp1),
197
bi_2_dec_char(bi_tmp2),
198
bi_2_dec_char(bi_tmp3),
199
bi_2_dec_char(bi_tmp4),
200
bi_2_dec_char(bi_tmp5),
201
bi_2_dec_char(bi_tmp6));
203
puts("!!! 9-1 == (6*3) mod 10\n"); exit(-1);
206
bi_shift_left(n, n, 10);
207
printf("1 << 10 = %s\n", bi_2_dec_char( n));
209
printf("(1 << 10) >> 5 = %s\n", bi_2_dec_char( bi_shift_right(bi_tmp, bi_shift_left(bi_tmp1, n, 10), 5)));
211
printf("[* (1 << 10) >> 5 *] = (2^10) / (2^5) -> %s\n", bi_2_dec_char( bi_shift_right( bi_tmp, ( bi_shift_left( bi_tmp1, n, 10)), 5)));
212
bi_set_as_si( n, 10);
213
printf(" (2^10) = %s\n", bi_2_dec_char( bi_mod_exp_si( bi_tmp, bi_2, n, 2000)));
214
printf(" (1<<5) = %s\n", bi_2_dec_char( bi_shift_left( bi_tmp, bi_set_as_si( bi_tmp1, 1), 5)));
215
printf(" 1024 / 500 = %s\n", bi_2_dec_char( bi_div( bi_tmp, bi_set_as_si( bi_tmp1, 1024), bi_set_as_si( bi_tmp2, 500))));
216
printf(" 1024 / 500 = %s\n", bi_2_dec_char( bi_div_si( bi_tmp, bi_set_as_si( bi_tmp1, 1024), 500)));
217
printf(" (1 << 10) >> 5 = [* (2^10) / (2^5) *] -> %s\n", bi_2_dec_char( bi_div( bi_tmp1,
218
bi_mod_exp_si( bi_tmp2, bi_2, bi_set_as_si( bi_tmp3, 10), 2000),
219
bi_mod_exp_si( bi_tmp4, bi_2, bi_set_as_si( bi_tmp5, 5), 2000) )));
221
printf("(1 << 10) >> 5 = (2^10) / (1<<5) -> %d\n", bi_equals( bi_shift_right( bi_tmp, ( bi_shift_left( bi_tmp1, bi_1, 10)), 5),
223
bi_mod_exp_si( bi_tmp3, bi_2, bi_set_as_si( bi_tmp4, 10), 2000),
224
bi_mod_exp_si( bi_tmp5, bi_2, bi_set_as_si( bi_tmp6, 5), 2000))));
225
printf("( 45 ^ -5 ) %% 10 == ( 1 / ( (45 ^ 5) %% 10) ) %% 10\n");
226
bi_set_as_si( bi_tmp, 45);
227
bi_set_as_si( bi_tmp1, 5);
228
// bi_negate( bi_tmp1);
229
bi_set_as_si( bi_tmp2, 10);
230
bi_mod_exp( bi_tmp3, bi_tmp, bi_tmp1, bi_tmp2);
231
bi_set_as_si( bi_tmp1, 5);
232
bi_mod_exp( bi_tmp4, bi_tmp, bi_tmp1, bi_tmp2);
233
printf("\t( 45 ^ -5 ) %% 10 = %s\n", bi_2_dec_char( bi_tmp3));
234
printf("\t( 1 / ( (45 ^ 5) %% 10) ) %% 10 = %s\n", bi_2_dec_char( bi_tmp4));
235
if( bi_equals( bi_tmp3, bi_tmp4) == 0) {
236
printf("!!! error !\n");
239
for( i=0; i<5; i++) {
240
bi_generate_prime( bi_tmp, 1024);
241
printf("bi=%s\n", bi_2_hex_char( bi_tmp));
242
printf("bi.length=%ld \n", bi_length( bi_tmp));
243
if( bi_length( bi_tmp) != 1024) { puts("!!! length(random(1024)) != 1024\n"); exit(-1); }
247
printf("setbit(10) = %s\n", bi_2_dec_char( n));
248
bi_set_as_dec(n, "123456");
250
printf("TEST:%s\n", bi_2_dec_char( r));
251
bi_urandom( n, 1024);
252
bi_urandom( r, 1024);
253
computeRandomNumber( r, n);
254
printf("r:%s n:%s\n", bi_2_hex_char( r), bi_2_hex_char( n));
255
bi_generate_prime( r, 1024);
256
printf("prime:%s\nIs probable prime:%d\n", bi_2_hex_char( r), bi_is_probable_prime( r));
257
int error = bi_invert_mod( r, r, n);
258
printf("Invert mod return:%d\nInvert(r):%s\n", error, bi_2_hex_char( r));
260
printf("negate(r):%s\n", bi_2_hex_char( r));
261
bi_generate_safe_prime( r, 128);
262
bi_sub_si( n, r, 1); // n= r - 1
263
bi_shift_right( n, n, 1); // n = n / 2
264
printf("safe prime(r):%s probable_prime:%d\n", bi_2_hex_char( r), bi_is_probable_prime( r));
265
printf("safe prime( (r-1)/2):%s probable_prime:%d\n", bi_2_hex_char( n), bi_is_probable_prime( n));
270
bi_set_as_si( result->array[0], 1);
271
printf("result-> 1<<20:%s\n", bi_2_dec_char( bi_shift_left( result->array[0], result->array[0], 20)));
272
bi_set_as_si( result->array[1], 1);
273
printf("result1-> 1<<10:%s\n", bi_2_dec_char( bi_shift_right( result->array[1], result->array[0], 10)));
275
bi_array new_result; bi_new_array2( new_result, 4);
276
bi_new_array2( new_result, 4);
277
bi_copy_array( result, 0, new_result, 0, 2);
278
bi_copy_array( result, 0, new_result, 2, 2);
279
for( i = 0; i<4; i++) {
280
printf("new_result[%d]-> [even-> 1<<20] [odd-> 1<<10] :%s\n", i, bi_2_dec_char( new_result->array[i]));
291
printf("THE END [%s,%s]\n", __DATE__, __TIME__);