~ubuntu-branches/ubuntu/utopic/trousers/utopic

« back to all changes in this revision

Viewing changes to src/tspi/daa/big_integer/test/test.c

  • Committer: Package Import Robot
  • Author(s): Pierre Chifflier
  • Date: 2013-08-20 18:01:47 UTC
  • mfrom: (1.1.7)
  • Revision ID: package-import@ubuntu.com-20130820180147-ucz33jh8z2qx47ya
Tags: 0.3.11.2-1
* Imported Upstream version 0.3.11.2
* Upstream license changed to BSD
* Example tools are not shipped anymore
* Remove 05-gcc47.patch, not needed anymore
* Updated symbols file

Show diffs side-by-side

added added

removed removed

Lines of Context:
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 */
9
 
setenv("TCSD_FOREGROUND", "1", 1);
10
 
 
11
 
 /*
12
 
   * standard bit length extension to obtain a uniformly distributed number
13
 
   * [0,element]
14
 
   */
15
 
int test_exp_multi(void);
16
 
 
17
 
void 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
 
 
25
 
void *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
 
   */
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>
46
 
}
47
 
 
48
 
int 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