1#include <stdlib.h> 2#include <stdio.h> 3#include <unistd.h> 4#include <string.h> 5 6#include <bi.h> 7 8/* for the logging system used by TSS */ 9setenv("TCSD_FOREGROUND", "1", 1); 10 11 /* 12 * standard bit length extension to obtain a uniformly distributed number 13 * [0,element] 14 */ 15int test_exp_multi(void); 16 17void foo (bi_t result, const bi_ptr param, unsigned long n) { 18 unsigned long i; 19 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); 23} 24 25void *my_malloc(size_t size) { 26 void *ret = malloc( size); 27 28 printf("my_malloc() -> %ld\n", (long)ret); 29 return ret; 30} 31 32 /** 33 * Returns a random number in the range of [0,element-1]. 34 * 35 * @param element 36 * the upper limit 37 * @param random 38 * the secure random source 39 * @return the random number 40 */ 41void 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> 46} 47 48int main (int argc, char **argv) { 49 bi_t bi_tmp, bi_tmp1, bi_tmp2, bi_tmp3, bi_tmp4, bi_tmp5, bi_tmp6; 50 bi_t r; 51 bi_t n; 52 int i; 53 unsigned char result1[5]; 54 int len; 55 char *byte_array; 56 FILE *file; 57 unsigned char ret[] = { (unsigned char)1, 0, (unsigned char)254 }; 58 int length; 59 unsigned char *buffer; 60 unsigned char byte; 61 bi_ptr nn; 62 63 bi_init( &my_malloc); 64 printf("test(%s,%s)\n", __DATE__, __TIME__); 65 #ifdef BI_GMP 66 printf("using BMP\n"); 67 #endif 68 #ifdef BI_OPENSSL 69 printf("using OPENSSL\n"); 70 #endif 71 72 bi_new( bi_tmp); 73 bi_new( bi_tmp1); 74 bi_new( bi_tmp2); 75 bi_new( bi_tmp3); 76 bi_new( bi_tmp4); 77 bi_new( bi_tmp5); 78 bi_new( bi_tmp6); 79 bi_new( n); 80 bi_new( r); 81 bi_set_as_hex( n, "75E8F38669C531EB78C7ACD62CCDEFFB5E5BE15E2AA55B3AD28B1A35F6E937097CE09A49C689AC335FBA669205CEF209275CFF273F8F81C5B864E5029EECDFA0743BC15D6E4D2C2CB0DED2DC7119A7E0D61669D417BB3B12BA1D10FD40326A49CA6C9E77F8585F25D8C897D9C73284152E103582C018C964F02ADDBA56CB1161A949AAE2847ADE8BC1152716C8B4AF37A87011C2569F646FD3EDA83099048B9525A6401C47A372F3EA43C91066AD5851AE11DEF1EAC7108FFB06AD94D0B849C339A5E8793C4C054456D3D22D30ACCCF7EF33EF7A7D65799E7908D95B0538A9EFC91BF104CE5008D79625394DB1E5883B2F202B95320BBD868BF65C996FC0DFC5"); 82 bi_set_as_hex( r, "35A624E6607CFD37162C6052547450B2267ECC749F10CDAEB5C294491321EEB47CA0229F423ADCEF3FA7806F5C4DB3C3445D8E7039EBC457149A1343BECF3B1078385C06EE74351A476BE0D5203633C81F7B8D68548DB763F0C096B20615B6016C180291EF32CC064A173BB22F6B46B3240ACC0B50D8338757FA28D5B0313BC4201CD2B35472842E71994C8FCA557B08004B2495304D13A93D796134BB8078E2EE371707DE5809D72474A7CCE1F865ECD8876105D3DB9AFA9426052D0120C755C60F56A0C0F30FAED2053CEB3129FAB6F57F6E209A8E7B2A559D734B339E19E1F2A147BC94DB2FF491CB5ACCEEEED7F2EA75AFF7CAD33E1E420A09135D9C5C1F"); 83 DUMP_BI( n); 84 DUMP_BI( r); 85 printf("big number n=n*r\n"); 86 bi_mul( n, n, r); 87 DUMP_BI( n); 88 bi_set_as_hex( r, "D7E7028DA181DADAC29C95143C865702453465115AFA7576AADF1E57DD84DA7FF4C8F66530D1E9D1AB69BC12342B89FA0A9755F9F4EE1DA445D50016CEF50622ED905CC9B987FCC7910CAA841641814C1994BC442A15CB05FE5C145626F1454E90435FBC6A529856EF29BDBCBFCB62FB69EDBD11DC33357667867278E1679EABCDBEEA02E9A6911804DF47ACA6B2D63A31E258AD542D71A8178A5E072F5E221EADBB10E16D5533AE427101FF94C5967575FABCD18305C5F15C103CEA1A8ACD01898E88426EDA7C0DF58AA48435808A840F6EEE1D7205D33F356E20FE0D4136B401BF386F11869C3CE4A808B96435694748EF3706F58756548A71E4CF4D2BE157"); 89 bi_mod( n, n, r); 90 printf("mod big number n=n mod r\n"); 91 DUMP_BI( 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 )); 94 exit(-1); 95 } 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 )); 98 exit(-1); 99 } 100 if( bi_get_si( bi_inc(bi_set_as_si( n, 13))) != 14) { 101 puts("!!! bi_inc 13++ = 14\n"); 102 exit(-1); 103 } 104 if( bi_get_si( bi_dec(bi_set_as_si( n, 13))) != 12) { 105 puts("!!! bi_dec 13-- = 12\n"); 106 exit(-1); 107 } 108 if( bi_get_si( bi_setbit(bi_set_as_si( n, 0), 10)) != 1024) { 109 puts("!!! bi_setbit set[10] = 1024\n"); 110 exit(-1); 111 } 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"); 114 exit(-1); 115 } 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"); 118 exit(-1); 119 } 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"); 122 exit(-1); 123 } 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"); 126 exit(-1); 127 } 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"); 130 exit(-1); 131 } 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]); 139 exit( -1); 140 } 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)); 144 free( 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)); 148 149 // test save end load of bi_t and bi_array 150 ///////////////////////////////////////////////////////////////////////////////////// 151 bi_array result; 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); 159 fclose( 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); 166 fclose( 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); } 170 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)); 180 } 181 printf("\n"); 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)); 185 exit(-1); 186 } 187 if( !bi_equals( bi_sub_si( bi_tmp, bi_set_as_si( bi_tmp1, 9), 1), 188 bi_mod( bi_tmp2, 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)); 202 exit(-1); 203 puts("!!! 9-1 == (6*3) mod 10\n"); exit(-1); 204 } 205 bi_set_as_si(n, 1); 206 bi_shift_left(n, n, 10); 207 printf("1 << 10 = %s\n", bi_2_dec_char( n)); 208 bi_set_as_si(n, 1); 209 printf("(1 << 10) >> 5 = %s\n", bi_2_dec_char( bi_shift_right(bi_tmp, bi_shift_left(bi_tmp1, n, 10), 5))); 210 bi_set_as_si(n, 1); 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) ))); 220 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), 222 bi_div( bi_tmp2, 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"); 237 exit( -1); 238 } 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); } 244 } 245 bi_set_as_si(n, 0); 246 bi_setbit( n, 10); 247 printf("setbit(10) = %s\n", bi_2_dec_char( n)); 248 bi_set_as_dec(n, "123456"); 249 foo( r, n, 20L); 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)); 259 bi_negate( 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)); 266 test_exp_multi(); 267 bi_free( r); 268 bi_free( n); 269 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))); 274 // copy arrays 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])); 281 } 282 283 bi_free( bi_tmp); 284 bi_free( bi_tmp1); 285 bi_free( bi_tmp2); 286 bi_free( bi_tmp3); 287 bi_free( bi_tmp4); 288 bi_free( bi_tmp5); 289 bi_free( bi_tmp6); 290 bi_release(); 291 printf("THE END [%s,%s]\n", __DATE__, __TIME__); 292 fflush(stdout); 293 return 0; 294 295} 296 297