OLD | NEW |
| (Empty) |
1 /* crypto/bn/bntest.c */ | |
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) | |
3 * All rights reserved. | |
4 * | |
5 * This package is an SSL implementation written | |
6 * by Eric Young (eay@cryptsoft.com). | |
7 * The implementation was written so as to conform with Netscapes SSL. | |
8 * | |
9 * This library is free for commercial and non-commercial use as long as | |
10 * the following conditions are aheared to. The following conditions | |
11 * apply to all code found in this distribution, be it the RC4, RSA, | |
12 * lhash, DES, etc., code; not just the SSL code. The SSL documentation | |
13 * included with this distribution is covered by the same copyright terms | |
14 * except that the holder is Tim Hudson (tjh@cryptsoft.com). | |
15 * | |
16 * Copyright remains Eric Young's, and as such any Copyright notices in | |
17 * the code are not to be removed. | |
18 * If this package is used in a product, Eric Young should be given attribution | |
19 * as the author of the parts of the library used. | |
20 * This can be in the form of a textual message at program startup or | |
21 * in documentation (online or textual) provided with the package. | |
22 * | |
23 * Redistribution and use in source and binary forms, with or without | |
24 * modification, are permitted provided that the following conditions | |
25 * are met: | |
26 * 1. Redistributions of source code must retain the copyright | |
27 * notice, this list of conditions and the following disclaimer. | |
28 * 2. Redistributions in binary form must reproduce the above copyright | |
29 * notice, this list of conditions and the following disclaimer in the | |
30 * documentation and/or other materials provided with the distribution. | |
31 * 3. All advertising materials mentioning features or use of this software | |
32 * must display the following acknowledgement: | |
33 * "This product includes cryptographic software written by | |
34 * Eric Young (eay@cryptsoft.com)" | |
35 * The word 'cryptographic' can be left out if the rouines from the library | |
36 * being used are not cryptographic related :-). | |
37 * 4. If you include any Windows specific code (or a derivative thereof) from | |
38 * the apps directory (application code) you must include an acknowledgement: | |
39 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" | |
40 * | |
41 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND | |
42 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | |
45 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
46 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |
47 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |
48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |
49 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |
50 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |
51 * SUCH DAMAGE. | |
52 * | |
53 * The licence and distribution terms for any publically available version or | |
54 * derivative of this code cannot be changed. i.e. this code cannot simply be | |
55 * copied and put under another distribution licence | |
56 * [including the GNU Public Licence.] | |
57 */ | |
58 /* ==================================================================== | |
59 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. | |
60 * | |
61 * Portions of the attached software ("Contribution") are developed by | |
62 * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project. | |
63 * | |
64 * The Contribution is licensed pursuant to the Eric Young open source | |
65 * license provided above. | |
66 * | |
67 * The binary polynomial arithmetic software is originally written by | |
68 * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories. | |
69 * | |
70 */ | |
71 | |
72 /* Until the key-gen callbacks are modified to use newer prototypes, we allow | |
73 * deprecated functions for openssl-internal code */ | |
74 #ifdef OPENSSL_NO_DEPRECATED | |
75 #undef OPENSSL_NO_DEPRECATED | |
76 #endif | |
77 | |
78 #include <stdio.h> | |
79 #include <stdlib.h> | |
80 #include <string.h> | |
81 | |
82 #include "e_os.h" | |
83 | |
84 #include <openssl/bio.h> | |
85 #include <openssl/bn.h> | |
86 #include <openssl/rand.h> | |
87 #include <openssl/x509.h> | |
88 #include <openssl/err.h> | |
89 | |
90 const int num0 = 100; /* number of tests */ | |
91 const int num1 = 50; /* additional tests for some functions */ | |
92 const int num2 = 5; /* number of tests for slow functions */ | |
93 | |
94 int test_add(BIO *bp); | |
95 int test_sub(BIO *bp); | |
96 int test_lshift1(BIO *bp); | |
97 int test_lshift(BIO *bp,BN_CTX *ctx,BIGNUM *a_); | |
98 int test_rshift1(BIO *bp); | |
99 int test_rshift(BIO *bp,BN_CTX *ctx); | |
100 int test_div(BIO *bp,BN_CTX *ctx); | |
101 int test_div_word(BIO *bp); | |
102 int test_div_recp(BIO *bp,BN_CTX *ctx); | |
103 int test_mul(BIO *bp); | |
104 int test_sqr(BIO *bp,BN_CTX *ctx); | |
105 int test_mont(BIO *bp,BN_CTX *ctx); | |
106 int test_mod(BIO *bp,BN_CTX *ctx); | |
107 int test_mod_mul(BIO *bp,BN_CTX *ctx); | |
108 int test_mod_exp(BIO *bp,BN_CTX *ctx); | |
109 int test_mod_exp_mont_consttime(BIO *bp,BN_CTX *ctx); | |
110 int test_exp(BIO *bp,BN_CTX *ctx); | |
111 int test_gf2m_add(BIO *bp); | |
112 int test_gf2m_mod(BIO *bp); | |
113 int test_gf2m_mod_mul(BIO *bp,BN_CTX *ctx); | |
114 int test_gf2m_mod_sqr(BIO *bp,BN_CTX *ctx); | |
115 int test_gf2m_mod_inv(BIO *bp,BN_CTX *ctx); | |
116 int test_gf2m_mod_div(BIO *bp,BN_CTX *ctx); | |
117 int test_gf2m_mod_exp(BIO *bp,BN_CTX *ctx); | |
118 int test_gf2m_mod_sqrt(BIO *bp,BN_CTX *ctx); | |
119 int test_gf2m_mod_solve_quad(BIO *bp,BN_CTX *ctx); | |
120 int test_kron(BIO *bp,BN_CTX *ctx); | |
121 int test_sqrt(BIO *bp,BN_CTX *ctx); | |
122 int rand_neg(void); | |
123 static int results=0; | |
124 | |
125 static unsigned char lst[]="\xC6\x4F\x43\x04\x2A\xEA\xCA\x6E\x58\x36\x80\x5B\xE8
\xC9" | |
126 "\x9B\x04\x5D\x48\x36\xC2\xFD\x16\xC9\x64\xF0"; | |
127 | |
128 static const char rnd_seed[] = "string to make the random number generator think
it has entropy"; | |
129 | |
130 static void message(BIO *out, char *m) | |
131 { | |
132 fprintf(stderr, "test %s\n", m); | |
133 BIO_puts(out, "print \"test "); | |
134 BIO_puts(out, m); | |
135 BIO_puts(out, "\\n\"\n"); | |
136 } | |
137 | |
138 int main(int argc, char *argv[]) | |
139 { | |
140 BN_CTX *ctx; | |
141 BIO *out; | |
142 char *outfile=NULL; | |
143 | |
144 results = 0; | |
145 | |
146 RAND_seed(rnd_seed, sizeof rnd_seed); /* or BN_generate_prime may fail *
/ | |
147 | |
148 argc--; | |
149 argv++; | |
150 while (argc >= 1) | |
151 { | |
152 if (strcmp(*argv,"-results") == 0) | |
153 results=1; | |
154 else if (strcmp(*argv,"-out") == 0) | |
155 { | |
156 if (--argc < 1) break; | |
157 outfile= *(++argv); | |
158 } | |
159 argc--; | |
160 argv++; | |
161 } | |
162 | |
163 | |
164 ctx=BN_CTX_new(); | |
165 if (ctx == NULL) EXIT(1); | |
166 | |
167 out=BIO_new(BIO_s_file()); | |
168 if (out == NULL) EXIT(1); | |
169 if (outfile == NULL) | |
170 { | |
171 BIO_set_fp(out,stdout,BIO_NOCLOSE); | |
172 } | |
173 else | |
174 { | |
175 if (!BIO_write_filename(out,outfile)) | |
176 { | |
177 perror(outfile); | |
178 EXIT(1); | |
179 } | |
180 } | |
181 | |
182 if (!results) | |
183 BIO_puts(out,"obase=16\nibase=16\n"); | |
184 | |
185 message(out,"BN_add"); | |
186 if (!test_add(out)) goto err; | |
187 (void)BIO_flush(out); | |
188 | |
189 message(out,"BN_sub"); | |
190 if (!test_sub(out)) goto err; | |
191 (void)BIO_flush(out); | |
192 | |
193 message(out,"BN_lshift1"); | |
194 if (!test_lshift1(out)) goto err; | |
195 (void)BIO_flush(out); | |
196 | |
197 message(out,"BN_lshift (fixed)"); | |
198 if (!test_lshift(out,ctx,BN_bin2bn(lst,sizeof(lst)-1,NULL))) | |
199 goto err; | |
200 (void)BIO_flush(out); | |
201 | |
202 message(out,"BN_lshift"); | |
203 if (!test_lshift(out,ctx,NULL)) goto err; | |
204 (void)BIO_flush(out); | |
205 | |
206 message(out,"BN_rshift1"); | |
207 if (!test_rshift1(out)) goto err; | |
208 (void)BIO_flush(out); | |
209 | |
210 message(out,"BN_rshift"); | |
211 if (!test_rshift(out,ctx)) goto err; | |
212 (void)BIO_flush(out); | |
213 | |
214 message(out,"BN_sqr"); | |
215 if (!test_sqr(out,ctx)) goto err; | |
216 (void)BIO_flush(out); | |
217 | |
218 message(out,"BN_mul"); | |
219 if (!test_mul(out)) goto err; | |
220 (void)BIO_flush(out); | |
221 | |
222 message(out,"BN_div"); | |
223 if (!test_div(out,ctx)) goto err; | |
224 (void)BIO_flush(out); | |
225 | |
226 message(out,"BN_div_word"); | |
227 if (!test_div_word(out)) goto err; | |
228 (void)BIO_flush(out); | |
229 | |
230 message(out,"BN_div_recp"); | |
231 if (!test_div_recp(out,ctx)) goto err; | |
232 (void)BIO_flush(out); | |
233 | |
234 message(out,"BN_mod"); | |
235 if (!test_mod(out,ctx)) goto err; | |
236 (void)BIO_flush(out); | |
237 | |
238 message(out,"BN_mod_mul"); | |
239 if (!test_mod_mul(out,ctx)) goto err; | |
240 (void)BIO_flush(out); | |
241 | |
242 message(out,"BN_mont"); | |
243 if (!test_mont(out,ctx)) goto err; | |
244 (void)BIO_flush(out); | |
245 | |
246 message(out,"BN_mod_exp"); | |
247 if (!test_mod_exp(out,ctx)) goto err; | |
248 (void)BIO_flush(out); | |
249 | |
250 message(out,"BN_mod_exp_mont_consttime"); | |
251 if (!test_mod_exp_mont_consttime(out,ctx)) goto err; | |
252 (void)BIO_flush(out); | |
253 | |
254 message(out,"BN_exp"); | |
255 if (!test_exp(out,ctx)) goto err; | |
256 (void)BIO_flush(out); | |
257 | |
258 message(out,"BN_kronecker"); | |
259 if (!test_kron(out,ctx)) goto err; | |
260 (void)BIO_flush(out); | |
261 | |
262 message(out,"BN_mod_sqrt"); | |
263 if (!test_sqrt(out,ctx)) goto err; | |
264 (void)BIO_flush(out); | |
265 #ifndef OPENSSL_NO_EC2M | |
266 message(out,"BN_GF2m_add"); | |
267 if (!test_gf2m_add(out)) goto err; | |
268 (void)BIO_flush(out); | |
269 | |
270 message(out,"BN_GF2m_mod"); | |
271 if (!test_gf2m_mod(out)) goto err; | |
272 (void)BIO_flush(out); | |
273 | |
274 message(out,"BN_GF2m_mod_mul"); | |
275 if (!test_gf2m_mod_mul(out,ctx)) goto err; | |
276 (void)BIO_flush(out); | |
277 | |
278 message(out,"BN_GF2m_mod_sqr"); | |
279 if (!test_gf2m_mod_sqr(out,ctx)) goto err; | |
280 (void)BIO_flush(out); | |
281 | |
282 message(out,"BN_GF2m_mod_inv"); | |
283 if (!test_gf2m_mod_inv(out,ctx)) goto err; | |
284 (void)BIO_flush(out); | |
285 | |
286 message(out,"BN_GF2m_mod_div"); | |
287 if (!test_gf2m_mod_div(out,ctx)) goto err; | |
288 (void)BIO_flush(out); | |
289 | |
290 message(out,"BN_GF2m_mod_exp"); | |
291 if (!test_gf2m_mod_exp(out,ctx)) goto err; | |
292 (void)BIO_flush(out); | |
293 | |
294 message(out,"BN_GF2m_mod_sqrt"); | |
295 if (!test_gf2m_mod_sqrt(out,ctx)) goto err; | |
296 (void)BIO_flush(out); | |
297 | |
298 message(out,"BN_GF2m_mod_solve_quad"); | |
299 if (!test_gf2m_mod_solve_quad(out,ctx)) goto err; | |
300 (void)BIO_flush(out); | |
301 #endif | |
302 BN_CTX_free(ctx); | |
303 BIO_free(out); | |
304 | |
305 /**/ | |
306 EXIT(0); | |
307 err: | |
308 BIO_puts(out,"1\n"); /* make sure the Perl script fed by bc notices | |
309 * the failure, see test_bn in test/Makefile.ssl*/ | |
310 (void)BIO_flush(out); | |
311 ERR_load_crypto_strings(); | |
312 ERR_print_errors_fp(stderr); | |
313 EXIT(1); | |
314 return(1); | |
315 } | |
316 | |
317 int test_add(BIO *bp) | |
318 { | |
319 BIGNUM a,b,c; | |
320 int i; | |
321 | |
322 BN_init(&a); | |
323 BN_init(&b); | |
324 BN_init(&c); | |
325 | |
326 BN_bntest_rand(&a,512,0,0); | |
327 for (i=0; i<num0; i++) | |
328 { | |
329 BN_bntest_rand(&b,450+i,0,0); | |
330 a.neg=rand_neg(); | |
331 b.neg=rand_neg(); | |
332 BN_add(&c,&a,&b); | |
333 if (bp != NULL) | |
334 { | |
335 if (!results) | |
336 { | |
337 BN_print(bp,&a); | |
338 BIO_puts(bp," + "); | |
339 BN_print(bp,&b); | |
340 BIO_puts(bp," - "); | |
341 } | |
342 BN_print(bp,&c); | |
343 BIO_puts(bp,"\n"); | |
344 } | |
345 a.neg=!a.neg; | |
346 b.neg=!b.neg; | |
347 BN_add(&c,&c,&b); | |
348 BN_add(&c,&c,&a); | |
349 if(!BN_is_zero(&c)) | |
350 { | |
351 fprintf(stderr,"Add test failed!\n"); | |
352 return 0; | |
353 } | |
354 } | |
355 BN_free(&a); | |
356 BN_free(&b); | |
357 BN_free(&c); | |
358 return(1); | |
359 } | |
360 | |
361 int test_sub(BIO *bp) | |
362 { | |
363 BIGNUM a,b,c; | |
364 int i; | |
365 | |
366 BN_init(&a); | |
367 BN_init(&b); | |
368 BN_init(&c); | |
369 | |
370 for (i=0; i<num0+num1; i++) | |
371 { | |
372 if (i < num1) | |
373 { | |
374 BN_bntest_rand(&a,512,0,0); | |
375 BN_copy(&b,&a); | |
376 if (BN_set_bit(&a,i)==0) return(0); | |
377 BN_add_word(&b,i); | |
378 } | |
379 else | |
380 { | |
381 BN_bntest_rand(&b,400+i-num1,0,0); | |
382 a.neg=rand_neg(); | |
383 b.neg=rand_neg(); | |
384 } | |
385 BN_sub(&c,&a,&b); | |
386 if (bp != NULL) | |
387 { | |
388 if (!results) | |
389 { | |
390 BN_print(bp,&a); | |
391 BIO_puts(bp," - "); | |
392 BN_print(bp,&b); | |
393 BIO_puts(bp," - "); | |
394 } | |
395 BN_print(bp,&c); | |
396 BIO_puts(bp,"\n"); | |
397 } | |
398 BN_add(&c,&c,&b); | |
399 BN_sub(&c,&c,&a); | |
400 if(!BN_is_zero(&c)) | |
401 { | |
402 fprintf(stderr,"Subtract test failed!\n"); | |
403 return 0; | |
404 } | |
405 } | |
406 BN_free(&a); | |
407 BN_free(&b); | |
408 BN_free(&c); | |
409 return(1); | |
410 } | |
411 | |
412 int test_div(BIO *bp, BN_CTX *ctx) | |
413 { | |
414 BIGNUM a,b,c,d,e; | |
415 int i; | |
416 | |
417 BN_init(&a); | |
418 BN_init(&b); | |
419 BN_init(&c); | |
420 BN_init(&d); | |
421 BN_init(&e); | |
422 | |
423 for (i=0; i<num0+num1; i++) | |
424 { | |
425 if (i < num1) | |
426 { | |
427 BN_bntest_rand(&a,400,0,0); | |
428 BN_copy(&b,&a); | |
429 BN_lshift(&a,&a,i); | |
430 BN_add_word(&a,i); | |
431 } | |
432 else | |
433 BN_bntest_rand(&b,50+3*(i-num1),0,0); | |
434 a.neg=rand_neg(); | |
435 b.neg=rand_neg(); | |
436 BN_div(&d,&c,&a,&b,ctx); | |
437 if (bp != NULL) | |
438 { | |
439 if (!results) | |
440 { | |
441 BN_print(bp,&a); | |
442 BIO_puts(bp," / "); | |
443 BN_print(bp,&b); | |
444 BIO_puts(bp," - "); | |
445 } | |
446 BN_print(bp,&d); | |
447 BIO_puts(bp,"\n"); | |
448 | |
449 if (!results) | |
450 { | |
451 BN_print(bp,&a); | |
452 BIO_puts(bp," % "); | |
453 BN_print(bp,&b); | |
454 BIO_puts(bp," - "); | |
455 } | |
456 BN_print(bp,&c); | |
457 BIO_puts(bp,"\n"); | |
458 } | |
459 BN_mul(&e,&d,&b,ctx); | |
460 BN_add(&d,&e,&c); | |
461 BN_sub(&d,&d,&a); | |
462 if(!BN_is_zero(&d)) | |
463 { | |
464 fprintf(stderr,"Division test failed!\n"); | |
465 return 0; | |
466 } | |
467 } | |
468 BN_free(&a); | |
469 BN_free(&b); | |
470 BN_free(&c); | |
471 BN_free(&d); | |
472 BN_free(&e); | |
473 return(1); | |
474 } | |
475 | |
476 static void print_word(BIO *bp,BN_ULONG w) | |
477 { | |
478 #ifdef SIXTY_FOUR_BIT | |
479 if (sizeof(w) > sizeof(unsigned long)) | |
480 { | |
481 unsigned long h=(unsigned long)(w>>32), | |
482 l=(unsigned long)(w); | |
483 | |
484 if (h) BIO_printf(bp,"%lX%08lX",h,l); | |
485 else BIO_printf(bp,"%lX",l); | |
486 return; | |
487 } | |
488 #endif | |
489 BIO_printf(bp,BN_HEX_FMT1,w); | |
490 } | |
491 | |
492 int test_div_word(BIO *bp) | |
493 { | |
494 BIGNUM a,b; | |
495 BN_ULONG r,s; | |
496 int i; | |
497 | |
498 BN_init(&a); | |
499 BN_init(&b); | |
500 | |
501 for (i=0; i<num0; i++) | |
502 { | |
503 do { | |
504 BN_bntest_rand(&a,512,-1,0); | |
505 BN_bntest_rand(&b,BN_BITS2,-1,0); | |
506 s = b.d[0]; | |
507 } while (!s); | |
508 | |
509 BN_copy(&b, &a); | |
510 r = BN_div_word(&b, s); | |
511 | |
512 if (bp != NULL) | |
513 { | |
514 if (!results) | |
515 { | |
516 BN_print(bp,&a); | |
517 BIO_puts(bp," / "); | |
518 print_word(bp,s); | |
519 BIO_puts(bp," - "); | |
520 } | |
521 BN_print(bp,&b); | |
522 BIO_puts(bp,"\n"); | |
523 | |
524 if (!results) | |
525 { | |
526 BN_print(bp,&a); | |
527 BIO_puts(bp," % "); | |
528 print_word(bp,s); | |
529 BIO_puts(bp," - "); | |
530 } | |
531 print_word(bp,r); | |
532 BIO_puts(bp,"\n"); | |
533 } | |
534 BN_mul_word(&b,s); | |
535 BN_add_word(&b,r); | |
536 BN_sub(&b,&a,&b); | |
537 if(!BN_is_zero(&b)) | |
538 { | |
539 fprintf(stderr,"Division (word) test failed!\n"); | |
540 return 0; | |
541 } | |
542 } | |
543 BN_free(&a); | |
544 BN_free(&b); | |
545 return(1); | |
546 } | |
547 | |
548 int test_div_recp(BIO *bp, BN_CTX *ctx) | |
549 { | |
550 BIGNUM a,b,c,d,e; | |
551 BN_RECP_CTX recp; | |
552 int i; | |
553 | |
554 BN_RECP_CTX_init(&recp); | |
555 BN_init(&a); | |
556 BN_init(&b); | |
557 BN_init(&c); | |
558 BN_init(&d); | |
559 BN_init(&e); | |
560 | |
561 for (i=0; i<num0+num1; i++) | |
562 { | |
563 if (i < num1) | |
564 { | |
565 BN_bntest_rand(&a,400,0,0); | |
566 BN_copy(&b,&a); | |
567 BN_lshift(&a,&a,i); | |
568 BN_add_word(&a,i); | |
569 } | |
570 else | |
571 BN_bntest_rand(&b,50+3*(i-num1),0,0); | |
572 a.neg=rand_neg(); | |
573 b.neg=rand_neg(); | |
574 BN_RECP_CTX_set(&recp,&b,ctx); | |
575 BN_div_recp(&d,&c,&a,&recp,ctx); | |
576 if (bp != NULL) | |
577 { | |
578 if (!results) | |
579 { | |
580 BN_print(bp,&a); | |
581 BIO_puts(bp," / "); | |
582 BN_print(bp,&b); | |
583 BIO_puts(bp," - "); | |
584 } | |
585 BN_print(bp,&d); | |
586 BIO_puts(bp,"\n"); | |
587 | |
588 if (!results) | |
589 { | |
590 BN_print(bp,&a); | |
591 BIO_puts(bp," % "); | |
592 BN_print(bp,&b); | |
593 BIO_puts(bp," - "); | |
594 } | |
595 BN_print(bp,&c); | |
596 BIO_puts(bp,"\n"); | |
597 } | |
598 BN_mul(&e,&d,&b,ctx); | |
599 BN_add(&d,&e,&c); | |
600 BN_sub(&d,&d,&a); | |
601 if(!BN_is_zero(&d)) | |
602 { | |
603 fprintf(stderr,"Reciprocal division test failed!\n"); | |
604 fprintf(stderr,"a="); | |
605 BN_print_fp(stderr,&a); | |
606 fprintf(stderr,"\nb="); | |
607 BN_print_fp(stderr,&b); | |
608 fprintf(stderr,"\n"); | |
609 return 0; | |
610 } | |
611 } | |
612 BN_free(&a); | |
613 BN_free(&b); | |
614 BN_free(&c); | |
615 BN_free(&d); | |
616 BN_free(&e); | |
617 BN_RECP_CTX_free(&recp); | |
618 return(1); | |
619 } | |
620 | |
621 int test_mul(BIO *bp) | |
622 { | |
623 BIGNUM a,b,c,d,e; | |
624 int i; | |
625 BN_CTX *ctx; | |
626 | |
627 ctx = BN_CTX_new(); | |
628 if (ctx == NULL) EXIT(1); | |
629 | |
630 BN_init(&a); | |
631 BN_init(&b); | |
632 BN_init(&c); | |
633 BN_init(&d); | |
634 BN_init(&e); | |
635 | |
636 for (i=0; i<num0+num1; i++) | |
637 { | |
638 if (i <= num1) | |
639 { | |
640 BN_bntest_rand(&a,100,0,0); | |
641 BN_bntest_rand(&b,100,0,0); | |
642 } | |
643 else | |
644 BN_bntest_rand(&b,i-num1,0,0); | |
645 a.neg=rand_neg(); | |
646 b.neg=rand_neg(); | |
647 BN_mul(&c,&a,&b,ctx); | |
648 if (bp != NULL) | |
649 { | |
650 if (!results) | |
651 { | |
652 BN_print(bp,&a); | |
653 BIO_puts(bp," * "); | |
654 BN_print(bp,&b); | |
655 BIO_puts(bp," - "); | |
656 } | |
657 BN_print(bp,&c); | |
658 BIO_puts(bp,"\n"); | |
659 } | |
660 BN_div(&d,&e,&c,&a,ctx); | |
661 BN_sub(&d,&d,&b); | |
662 if(!BN_is_zero(&d) || !BN_is_zero(&e)) | |
663 { | |
664 fprintf(stderr,"Multiplication test failed!\n"); | |
665 return 0; | |
666 } | |
667 } | |
668 BN_free(&a); | |
669 BN_free(&b); | |
670 BN_free(&c); | |
671 BN_free(&d); | |
672 BN_free(&e); | |
673 BN_CTX_free(ctx); | |
674 return(1); | |
675 } | |
676 | |
677 int test_sqr(BIO *bp, BN_CTX *ctx) | |
678 { | |
679 BIGNUM a,c,d,e; | |
680 int i; | |
681 | |
682 BN_init(&a); | |
683 BN_init(&c); | |
684 BN_init(&d); | |
685 BN_init(&e); | |
686 | |
687 for (i=0; i<num0; i++) | |
688 { | |
689 BN_bntest_rand(&a,40+i*10,0,0); | |
690 a.neg=rand_neg(); | |
691 BN_sqr(&c,&a,ctx); | |
692 if (bp != NULL) | |
693 { | |
694 if (!results) | |
695 { | |
696 BN_print(bp,&a); | |
697 BIO_puts(bp," * "); | |
698 BN_print(bp,&a); | |
699 BIO_puts(bp," - "); | |
700 } | |
701 BN_print(bp,&c); | |
702 BIO_puts(bp,"\n"); | |
703 } | |
704 BN_div(&d,&e,&c,&a,ctx); | |
705 BN_sub(&d,&d,&a); | |
706 if(!BN_is_zero(&d) || !BN_is_zero(&e)) | |
707 { | |
708 fprintf(stderr,"Square test failed!\n"); | |
709 return 0; | |
710 } | |
711 } | |
712 BN_free(&a); | |
713 BN_free(&c); | |
714 BN_free(&d); | |
715 BN_free(&e); | |
716 return(1); | |
717 } | |
718 | |
719 int test_mont(BIO *bp, BN_CTX *ctx) | |
720 { | |
721 BIGNUM a,b,c,d,A,B; | |
722 BIGNUM n; | |
723 int i; | |
724 BN_MONT_CTX *mont; | |
725 | |
726 BN_init(&a); | |
727 BN_init(&b); | |
728 BN_init(&c); | |
729 BN_init(&d); | |
730 BN_init(&A); | |
731 BN_init(&B); | |
732 BN_init(&n); | |
733 | |
734 mont=BN_MONT_CTX_new(); | |
735 if (mont == NULL) | |
736 return 0; | |
737 | |
738 BN_bntest_rand(&a,100,0,0); /**/ | |
739 BN_bntest_rand(&b,100,0,0); /**/ | |
740 for (i=0; i<num2; i++) | |
741 { | |
742 int bits = (200*(i+1))/num2; | |
743 | |
744 if (bits == 0) | |
745 continue; | |
746 BN_bntest_rand(&n,bits,0,1); | |
747 BN_MONT_CTX_set(mont,&n,ctx); | |
748 | |
749 BN_nnmod(&a,&a,&n,ctx); | |
750 BN_nnmod(&b,&b,&n,ctx); | |
751 | |
752 BN_to_montgomery(&A,&a,mont,ctx); | |
753 BN_to_montgomery(&B,&b,mont,ctx); | |
754 | |
755 BN_mod_mul_montgomery(&c,&A,&B,mont,ctx);/**/ | |
756 BN_from_montgomery(&A,&c,mont,ctx);/**/ | |
757 if (bp != NULL) | |
758 { | |
759 if (!results) | |
760 { | |
761 #ifdef undef | |
762 fprintf(stderr,"%d * %d %% %d\n", | |
763 BN_num_bits(&a), | |
764 BN_num_bits(&b), | |
765 BN_num_bits(mont->N)); | |
766 #endif | |
767 BN_print(bp,&a); | |
768 BIO_puts(bp," * "); | |
769 BN_print(bp,&b); | |
770 BIO_puts(bp," % "); | |
771 BN_print(bp,&(mont->N)); | |
772 BIO_puts(bp," - "); | |
773 } | |
774 BN_print(bp,&A); | |
775 BIO_puts(bp,"\n"); | |
776 } | |
777 BN_mod_mul(&d,&a,&b,&n,ctx); | |
778 BN_sub(&d,&d,&A); | |
779 if(!BN_is_zero(&d)) | |
780 { | |
781 fprintf(stderr,"Montgomery multiplication test failed!\n"); | |
782 return 0; | |
783 } | |
784 } | |
785 BN_MONT_CTX_free(mont); | |
786 BN_free(&a); | |
787 BN_free(&b); | |
788 BN_free(&c); | |
789 BN_free(&d); | |
790 BN_free(&A); | |
791 BN_free(&B); | |
792 BN_free(&n); | |
793 return(1); | |
794 } | |
795 | |
796 int test_mod(BIO *bp, BN_CTX *ctx) | |
797 { | |
798 BIGNUM *a,*b,*c,*d,*e; | |
799 int i; | |
800 | |
801 a=BN_new(); | |
802 b=BN_new(); | |
803 c=BN_new(); | |
804 d=BN_new(); | |
805 e=BN_new(); | |
806 | |
807 BN_bntest_rand(a,1024,0,0); /**/ | |
808 for (i=0; i<num0; i++) | |
809 { | |
810 BN_bntest_rand(b,450+i*10,0,0); /**/ | |
811 a->neg=rand_neg(); | |
812 b->neg=rand_neg(); | |
813 BN_mod(c,a,b,ctx);/**/ | |
814 if (bp != NULL) | |
815 { | |
816 if (!results) | |
817 { | |
818 BN_print(bp,a); | |
819 BIO_puts(bp," % "); | |
820 BN_print(bp,b); | |
821 BIO_puts(bp," - "); | |
822 } | |
823 BN_print(bp,c); | |
824 BIO_puts(bp,"\n"); | |
825 } | |
826 BN_div(d,e,a,b,ctx); | |
827 BN_sub(e,e,c); | |
828 if(!BN_is_zero(e)) | |
829 { | |
830 fprintf(stderr,"Modulo test failed!\n"); | |
831 return 0; | |
832 } | |
833 } | |
834 BN_free(a); | |
835 BN_free(b); | |
836 BN_free(c); | |
837 BN_free(d); | |
838 BN_free(e); | |
839 return(1); | |
840 } | |
841 | |
842 int test_mod_mul(BIO *bp, BN_CTX *ctx) | |
843 { | |
844 BIGNUM *a,*b,*c,*d,*e; | |
845 int i,j; | |
846 | |
847 a=BN_new(); | |
848 b=BN_new(); | |
849 c=BN_new(); | |
850 d=BN_new(); | |
851 e=BN_new(); | |
852 | |
853 for (j=0; j<3; j++) { | |
854 BN_bntest_rand(c,1024,0,0); /**/ | |
855 for (i=0; i<num0; i++) | |
856 { | |
857 BN_bntest_rand(a,475+i*10,0,0); /**/ | |
858 BN_bntest_rand(b,425+i*11,0,0); /**/ | |
859 a->neg=rand_neg(); | |
860 b->neg=rand_neg(); | |
861 if (!BN_mod_mul(e,a,b,c,ctx)) | |
862 { | |
863 unsigned long l; | |
864 | |
865 while ((l=ERR_get_error())) | |
866 fprintf(stderr,"ERROR:%s\n", | |
867 ERR_error_string(l,NULL)); | |
868 EXIT(1); | |
869 } | |
870 if (bp != NULL) | |
871 { | |
872 if (!results) | |
873 { | |
874 BN_print(bp,a); | |
875 BIO_puts(bp," * "); | |
876 BN_print(bp,b); | |
877 BIO_puts(bp," % "); | |
878 BN_print(bp,c); | |
879 if ((a->neg ^ b->neg) && !BN_is_zero(e)) | |
880 { | |
881 /* If (a*b) % c is negative, c must
be added | |
882 * in order to obtain the normalized rem
ainder | |
883 * (new with OpenSSL 0.9.7, previous ver
sions of | |
884 * BN_mod_mul could generate negative re
sults) | |
885 */ | |
886 BIO_puts(bp," + "); | |
887 BN_print(bp,c); | |
888 } | |
889 BIO_puts(bp," - "); | |
890 } | |
891 BN_print(bp,e); | |
892 BIO_puts(bp,"\n"); | |
893 } | |
894 BN_mul(d,a,b,ctx); | |
895 BN_sub(d,d,e); | |
896 BN_div(a,b,d,c,ctx); | |
897 if(!BN_is_zero(b)) | |
898 { | |
899 fprintf(stderr,"Modulo multiply test failed!\n"); | |
900 ERR_print_errors_fp(stderr); | |
901 return 0; | |
902 } | |
903 } | |
904 } | |
905 BN_free(a); | |
906 BN_free(b); | |
907 BN_free(c); | |
908 BN_free(d); | |
909 BN_free(e); | |
910 return(1); | |
911 } | |
912 | |
913 int test_mod_exp(BIO *bp, BN_CTX *ctx) | |
914 { | |
915 BIGNUM *a,*b,*c,*d,*e; | |
916 int i; | |
917 | |
918 a=BN_new(); | |
919 b=BN_new(); | |
920 c=BN_new(); | |
921 d=BN_new(); | |
922 e=BN_new(); | |
923 | |
924 BN_bntest_rand(c,30,0,1); /* must be odd for montgomery */ | |
925 for (i=0; i<num2; i++) | |
926 { | |
927 BN_bntest_rand(a,20+i*5,0,0); /**/ | |
928 BN_bntest_rand(b,2+i,0,0); /**/ | |
929 | |
930 if (!BN_mod_exp(d,a,b,c,ctx)) | |
931 return(0); | |
932 | |
933 if (bp != NULL) | |
934 { | |
935 if (!results) | |
936 { | |
937 BN_print(bp,a); | |
938 BIO_puts(bp," ^ "); | |
939 BN_print(bp,b); | |
940 BIO_puts(bp," % "); | |
941 BN_print(bp,c); | |
942 BIO_puts(bp," - "); | |
943 } | |
944 BN_print(bp,d); | |
945 BIO_puts(bp,"\n"); | |
946 } | |
947 BN_exp(e,a,b,ctx); | |
948 BN_sub(e,e,d); | |
949 BN_div(a,b,e,c,ctx); | |
950 if(!BN_is_zero(b)) | |
951 { | |
952 fprintf(stderr,"Modulo exponentiation test failed!\n"); | |
953 return 0; | |
954 } | |
955 } | |
956 BN_free(a); | |
957 BN_free(b); | |
958 BN_free(c); | |
959 BN_free(d); | |
960 BN_free(e); | |
961 return(1); | |
962 } | |
963 | |
964 int test_mod_exp_mont_consttime(BIO *bp, BN_CTX *ctx) | |
965 { | |
966 BIGNUM *a,*b,*c,*d,*e; | |
967 int i; | |
968 | |
969 a=BN_new(); | |
970 b=BN_new(); | |
971 c=BN_new(); | |
972 d=BN_new(); | |
973 e=BN_new(); | |
974 | |
975 BN_bntest_rand(c,30,0,1); /* must be odd for montgomery */ | |
976 for (i=0; i<num2; i++) | |
977 { | |
978 BN_bntest_rand(a,20+i*5,0,0); /**/ | |
979 BN_bntest_rand(b,2+i,0,0); /**/ | |
980 | |
981 if (!BN_mod_exp_mont_consttime(d,a,b,c,ctx,NULL)) | |
982 return(00); | |
983 | |
984 if (bp != NULL) | |
985 { | |
986 if (!results) | |
987 { | |
988 BN_print(bp,a); | |
989 BIO_puts(bp," ^ "); | |
990 BN_print(bp,b); | |
991 BIO_puts(bp," % "); | |
992 BN_print(bp,c); | |
993 BIO_puts(bp," - "); | |
994 } | |
995 BN_print(bp,d); | |
996 BIO_puts(bp,"\n"); | |
997 } | |
998 BN_exp(e,a,b,ctx); | |
999 BN_sub(e,e,d); | |
1000 BN_div(a,b,e,c,ctx); | |
1001 if(!BN_is_zero(b)) | |
1002 { | |
1003 fprintf(stderr,"Modulo exponentiation test failed!\n"); | |
1004 return 0; | |
1005 } | |
1006 } | |
1007 BN_free(a); | |
1008 BN_free(b); | |
1009 BN_free(c); | |
1010 BN_free(d); | |
1011 BN_free(e); | |
1012 return(1); | |
1013 } | |
1014 | |
1015 int test_exp(BIO *bp, BN_CTX *ctx) | |
1016 { | |
1017 BIGNUM *a,*b,*d,*e,*one; | |
1018 int i; | |
1019 | |
1020 a=BN_new(); | |
1021 b=BN_new(); | |
1022 d=BN_new(); | |
1023 e=BN_new(); | |
1024 one=BN_new(); | |
1025 BN_one(one); | |
1026 | |
1027 for (i=0; i<num2; i++) | |
1028 { | |
1029 BN_bntest_rand(a,20+i*5,0,0); /**/ | |
1030 BN_bntest_rand(b,2+i,0,0); /**/ | |
1031 | |
1032 if (BN_exp(d,a,b,ctx) <= 0) | |
1033 return(0); | |
1034 | |
1035 if (bp != NULL) | |
1036 { | |
1037 if (!results) | |
1038 { | |
1039 BN_print(bp,a); | |
1040 BIO_puts(bp," ^ "); | |
1041 BN_print(bp,b); | |
1042 BIO_puts(bp," - "); | |
1043 } | |
1044 BN_print(bp,d); | |
1045 BIO_puts(bp,"\n"); | |
1046 } | |
1047 BN_one(e); | |
1048 for( ; !BN_is_zero(b) ; BN_sub(b,b,one)) | |
1049 BN_mul(e,e,a,ctx); | |
1050 BN_sub(e,e,d); | |
1051 if(!BN_is_zero(e)) | |
1052 { | |
1053 fprintf(stderr,"Exponentiation test failed!\n"); | |
1054 return 0; | |
1055 } | |
1056 } | |
1057 BN_free(a); | |
1058 BN_free(b); | |
1059 BN_free(d); | |
1060 BN_free(e); | |
1061 BN_free(one); | |
1062 return(1); | |
1063 } | |
1064 #ifndef OPENSSL_NO_EC2M | |
1065 int test_gf2m_add(BIO *bp) | |
1066 { | |
1067 BIGNUM a,b,c; | |
1068 int i, ret = 0; | |
1069 | |
1070 BN_init(&a); | |
1071 BN_init(&b); | |
1072 BN_init(&c); | |
1073 | |
1074 for (i=0; i<num0; i++) | |
1075 { | |
1076 BN_rand(&a,512,0,0); | |
1077 BN_copy(&b, BN_value_one()); | |
1078 a.neg=rand_neg(); | |
1079 b.neg=rand_neg(); | |
1080 BN_GF2m_add(&c,&a,&b); | |
1081 #if 0 /* make test uses ouput in bc but bc can't handle GF(2^m) arithmetic */ | |
1082 if (bp != NULL) | |
1083 { | |
1084 if (!results) | |
1085 { | |
1086 BN_print(bp,&a); | |
1087 BIO_puts(bp," ^ "); | |
1088 BN_print(bp,&b); | |
1089 BIO_puts(bp," = "); | |
1090 } | |
1091 BN_print(bp,&c); | |
1092 BIO_puts(bp,"\n"); | |
1093 } | |
1094 #endif | |
1095 /* Test that two added values have the correct parity. */ | |
1096 if((BN_is_odd(&a) && BN_is_odd(&c)) || (!BN_is_odd(&a) && !BN_is
_odd(&c))) | |
1097 { | |
1098 fprintf(stderr,"GF(2^m) addition test (a) failed!\n"); | |
1099 goto err; | |
1100 } | |
1101 BN_GF2m_add(&c,&c,&c); | |
1102 /* Test that c + c = 0. */ | |
1103 if(!BN_is_zero(&c)) | |
1104 { | |
1105 fprintf(stderr,"GF(2^m) addition test (b) failed!\n"); | |
1106 goto err; | |
1107 } | |
1108 } | |
1109 ret = 1; | |
1110 err: | |
1111 BN_free(&a); | |
1112 BN_free(&b); | |
1113 BN_free(&c); | |
1114 return ret; | |
1115 } | |
1116 | |
1117 int test_gf2m_mod(BIO *bp) | |
1118 { | |
1119 BIGNUM *a,*b[2],*c,*d,*e; | |
1120 int i, j, ret = 0; | |
1121 int p0[] = {163,7,6,3,0,-1}; | |
1122 int p1[] = {193,15,0,-1}; | |
1123 | |
1124 a=BN_new(); | |
1125 b[0]=BN_new(); | |
1126 b[1]=BN_new(); | |
1127 c=BN_new(); | |
1128 d=BN_new(); | |
1129 e=BN_new(); | |
1130 | |
1131 BN_GF2m_arr2poly(p0, b[0]); | |
1132 BN_GF2m_arr2poly(p1, b[1]); | |
1133 | |
1134 for (i=0; i<num0; i++) | |
1135 { | |
1136 BN_bntest_rand(a, 1024, 0, 0); | |
1137 for (j=0; j < 2; j++) | |
1138 { | |
1139 BN_GF2m_mod(c, a, b[j]); | |
1140 #if 0 /* make test uses ouput in bc but bc can't handle GF(2^m) arithmetic */ | |
1141 if (bp != NULL) | |
1142 { | |
1143 if (!results) | |
1144 { | |
1145 BN_print(bp,a); | |
1146 BIO_puts(bp," % "); | |
1147 BN_print(bp,b[j]); | |
1148 BIO_puts(bp," - "); | |
1149 BN_print(bp,c); | |
1150 BIO_puts(bp,"\n"); | |
1151 } | |
1152 } | |
1153 #endif | |
1154 BN_GF2m_add(d, a, c); | |
1155 BN_GF2m_mod(e, d, b[j]); | |
1156 /* Test that a + (a mod p) mod p == 0. */ | |
1157 if(!BN_is_zero(e)) | |
1158 { | |
1159 fprintf(stderr,"GF(2^m) modulo test failed!\n"); | |
1160 goto err; | |
1161 } | |
1162 } | |
1163 } | |
1164 ret = 1; | |
1165 err: | |
1166 BN_free(a); | |
1167 BN_free(b[0]); | |
1168 BN_free(b[1]); | |
1169 BN_free(c); | |
1170 BN_free(d); | |
1171 BN_free(e); | |
1172 return ret; | |
1173 } | |
1174 | |
1175 int test_gf2m_mod_mul(BIO *bp,BN_CTX *ctx) | |
1176 { | |
1177 BIGNUM *a,*b[2],*c,*d,*e,*f,*g,*h; | |
1178 int i, j, ret = 0; | |
1179 int p0[] = {163,7,6,3,0,-1}; | |
1180 int p1[] = {193,15,0,-1}; | |
1181 | |
1182 a=BN_new(); | |
1183 b[0]=BN_new(); | |
1184 b[1]=BN_new(); | |
1185 c=BN_new(); | |
1186 d=BN_new(); | |
1187 e=BN_new(); | |
1188 f=BN_new(); | |
1189 g=BN_new(); | |
1190 h=BN_new(); | |
1191 | |
1192 BN_GF2m_arr2poly(p0, b[0]); | |
1193 BN_GF2m_arr2poly(p1, b[1]); | |
1194 | |
1195 for (i=0; i<num0; i++) | |
1196 { | |
1197 BN_bntest_rand(a, 1024, 0, 0); | |
1198 BN_bntest_rand(c, 1024, 0, 0); | |
1199 BN_bntest_rand(d, 1024, 0, 0); | |
1200 for (j=0; j < 2; j++) | |
1201 { | |
1202 BN_GF2m_mod_mul(e, a, c, b[j], ctx); | |
1203 #if 0 /* make test uses ouput in bc but bc can't handle GF(2^m) arithmetic */ | |
1204 if (bp != NULL) | |
1205 { | |
1206 if (!results) | |
1207 { | |
1208 BN_print(bp,a); | |
1209 BIO_puts(bp," * "); | |
1210 BN_print(bp,c); | |
1211 BIO_puts(bp," % "); | |
1212 BN_print(bp,b[j]); | |
1213 BIO_puts(bp," - "); | |
1214 BN_print(bp,e); | |
1215 BIO_puts(bp,"\n"); | |
1216 } | |
1217 } | |
1218 #endif | |
1219 BN_GF2m_add(f, a, d); | |
1220 BN_GF2m_mod_mul(g, f, c, b[j], ctx); | |
1221 BN_GF2m_mod_mul(h, d, c, b[j], ctx); | |
1222 BN_GF2m_add(f, e, g); | |
1223 BN_GF2m_add(f, f, h); | |
1224 /* Test that (a+d)*c = a*c + d*c. */ | |
1225 if(!BN_is_zero(f)) | |
1226 { | |
1227 fprintf(stderr,"GF(2^m) modular multiplication t
est failed!\n"); | |
1228 goto err; | |
1229 } | |
1230 } | |
1231 } | |
1232 ret = 1; | |
1233 err: | |
1234 BN_free(a); | |
1235 BN_free(b[0]); | |
1236 BN_free(b[1]); | |
1237 BN_free(c); | |
1238 BN_free(d); | |
1239 BN_free(e); | |
1240 BN_free(f); | |
1241 BN_free(g); | |
1242 BN_free(h); | |
1243 return ret; | |
1244 } | |
1245 | |
1246 int test_gf2m_mod_sqr(BIO *bp,BN_CTX *ctx) | |
1247 { | |
1248 BIGNUM *a,*b[2],*c,*d; | |
1249 int i, j, ret = 0; | |
1250 int p0[] = {163,7,6,3,0,-1}; | |
1251 int p1[] = {193,15,0,-1}; | |
1252 | |
1253 a=BN_new(); | |
1254 b[0]=BN_new(); | |
1255 b[1]=BN_new(); | |
1256 c=BN_new(); | |
1257 d=BN_new(); | |
1258 | |
1259 BN_GF2m_arr2poly(p0, b[0]); | |
1260 BN_GF2m_arr2poly(p1, b[1]); | |
1261 | |
1262 for (i=0; i<num0; i++) | |
1263 { | |
1264 BN_bntest_rand(a, 1024, 0, 0); | |
1265 for (j=0; j < 2; j++) | |
1266 { | |
1267 BN_GF2m_mod_sqr(c, a, b[j], ctx); | |
1268 BN_copy(d, a); | |
1269 BN_GF2m_mod_mul(d, a, d, b[j], ctx); | |
1270 #if 0 /* make test uses ouput in bc but bc can't handle GF(2^m) arithmetic */ | |
1271 if (bp != NULL) | |
1272 { | |
1273 if (!results) | |
1274 { | |
1275 BN_print(bp,a); | |
1276 BIO_puts(bp," ^ 2 % "); | |
1277 BN_print(bp,b[j]); | |
1278 BIO_puts(bp, " = "); | |
1279 BN_print(bp,c); | |
1280 BIO_puts(bp,"; a * a = "); | |
1281 BN_print(bp,d); | |
1282 BIO_puts(bp,"\n"); | |
1283 } | |
1284 } | |
1285 #endif | |
1286 BN_GF2m_add(d, c, d); | |
1287 /* Test that a*a = a^2. */ | |
1288 if(!BN_is_zero(d)) | |
1289 { | |
1290 fprintf(stderr,"GF(2^m) modular squaring test fa
iled!\n"); | |
1291 goto err; | |
1292 } | |
1293 } | |
1294 } | |
1295 ret = 1; | |
1296 err: | |
1297 BN_free(a); | |
1298 BN_free(b[0]); | |
1299 BN_free(b[1]); | |
1300 BN_free(c); | |
1301 BN_free(d); | |
1302 return ret; | |
1303 } | |
1304 | |
1305 int test_gf2m_mod_inv(BIO *bp,BN_CTX *ctx) | |
1306 { | |
1307 BIGNUM *a,*b[2],*c,*d; | |
1308 int i, j, ret = 0; | |
1309 int p0[] = {163,7,6,3,0,-1}; | |
1310 int p1[] = {193,15,0,-1}; | |
1311 | |
1312 a=BN_new(); | |
1313 b[0]=BN_new(); | |
1314 b[1]=BN_new(); | |
1315 c=BN_new(); | |
1316 d=BN_new(); | |
1317 | |
1318 BN_GF2m_arr2poly(p0, b[0]); | |
1319 BN_GF2m_arr2poly(p1, b[1]); | |
1320 | |
1321 for (i=0; i<num0; i++) | |
1322 { | |
1323 BN_bntest_rand(a, 512, 0, 0); | |
1324 for (j=0; j < 2; j++) | |
1325 { | |
1326 BN_GF2m_mod_inv(c, a, b[j], ctx); | |
1327 BN_GF2m_mod_mul(d, a, c, b[j], ctx); | |
1328 #if 0 /* make test uses ouput in bc but bc can't handle GF(2^m) arithmetic */ | |
1329 if (bp != NULL) | |
1330 { | |
1331 if (!results) | |
1332 { | |
1333 BN_print(bp,a); | |
1334 BIO_puts(bp, " * "); | |
1335 BN_print(bp,c); | |
1336 BIO_puts(bp," - 1 % "); | |
1337 BN_print(bp,b[j]); | |
1338 BIO_puts(bp,"\n"); | |
1339 } | |
1340 } | |
1341 #endif | |
1342 /* Test that ((1/a)*a) = 1. */ | |
1343 if(!BN_is_one(d)) | |
1344 { | |
1345 fprintf(stderr,"GF(2^m) modular inversion test f
ailed!\n"); | |
1346 goto err; | |
1347 } | |
1348 } | |
1349 } | |
1350 ret = 1; | |
1351 err: | |
1352 BN_free(a); | |
1353 BN_free(b[0]); | |
1354 BN_free(b[1]); | |
1355 BN_free(c); | |
1356 BN_free(d); | |
1357 return ret; | |
1358 } | |
1359 | |
1360 int test_gf2m_mod_div(BIO *bp,BN_CTX *ctx) | |
1361 { | |
1362 BIGNUM *a,*b[2],*c,*d,*e,*f; | |
1363 int i, j, ret = 0; | |
1364 int p0[] = {163,7,6,3,0,-1}; | |
1365 int p1[] = {193,15,0,-1}; | |
1366 | |
1367 a=BN_new(); | |
1368 b[0]=BN_new(); | |
1369 b[1]=BN_new(); | |
1370 c=BN_new(); | |
1371 d=BN_new(); | |
1372 e=BN_new(); | |
1373 f=BN_new(); | |
1374 | |
1375 BN_GF2m_arr2poly(p0, b[0]); | |
1376 BN_GF2m_arr2poly(p1, b[1]); | |
1377 | |
1378 for (i=0; i<num0; i++) | |
1379 { | |
1380 BN_bntest_rand(a, 512, 0, 0); | |
1381 BN_bntest_rand(c, 512, 0, 0); | |
1382 for (j=0; j < 2; j++) | |
1383 { | |
1384 BN_GF2m_mod_div(d, a, c, b[j], ctx); | |
1385 BN_GF2m_mod_mul(e, d, c, b[j], ctx); | |
1386 BN_GF2m_mod_div(f, a, e, b[j], ctx); | |
1387 #if 0 /* make test uses ouput in bc but bc can't handle GF(2^m) arithmetic */ | |
1388 if (bp != NULL) | |
1389 { | |
1390 if (!results) | |
1391 { | |
1392 BN_print(bp,a); | |
1393 BIO_puts(bp, " = "); | |
1394 BN_print(bp,c); | |
1395 BIO_puts(bp," * "); | |
1396 BN_print(bp,d); | |
1397 BIO_puts(bp, " % "); | |
1398 BN_print(bp,b[j]); | |
1399 BIO_puts(bp,"\n"); | |
1400 } | |
1401 } | |
1402 #endif | |
1403 /* Test that ((a/c)*c)/a = 1. */ | |
1404 if(!BN_is_one(f)) | |
1405 { | |
1406 fprintf(stderr,"GF(2^m) modular division test fa
iled!\n"); | |
1407 goto err; | |
1408 } | |
1409 } | |
1410 } | |
1411 ret = 1; | |
1412 err: | |
1413 BN_free(a); | |
1414 BN_free(b[0]); | |
1415 BN_free(b[1]); | |
1416 BN_free(c); | |
1417 BN_free(d); | |
1418 BN_free(e); | |
1419 BN_free(f); | |
1420 return ret; | |
1421 } | |
1422 | |
1423 int test_gf2m_mod_exp(BIO *bp,BN_CTX *ctx) | |
1424 { | |
1425 BIGNUM *a,*b[2],*c,*d,*e,*f; | |
1426 int i, j, ret = 0; | |
1427 int p0[] = {163,7,6,3,0,-1}; | |
1428 int p1[] = {193,15,0,-1}; | |
1429 | |
1430 a=BN_new(); | |
1431 b[0]=BN_new(); | |
1432 b[1]=BN_new(); | |
1433 c=BN_new(); | |
1434 d=BN_new(); | |
1435 e=BN_new(); | |
1436 f=BN_new(); | |
1437 | |
1438 BN_GF2m_arr2poly(p0, b[0]); | |
1439 BN_GF2m_arr2poly(p1, b[1]); | |
1440 | |
1441 for (i=0; i<num0; i++) | |
1442 { | |
1443 BN_bntest_rand(a, 512, 0, 0); | |
1444 BN_bntest_rand(c, 512, 0, 0); | |
1445 BN_bntest_rand(d, 512, 0, 0); | |
1446 for (j=0; j < 2; j++) | |
1447 { | |
1448 BN_GF2m_mod_exp(e, a, c, b[j], ctx); | |
1449 BN_GF2m_mod_exp(f, a, d, b[j], ctx); | |
1450 BN_GF2m_mod_mul(e, e, f, b[j], ctx); | |
1451 BN_add(f, c, d); | |
1452 BN_GF2m_mod_exp(f, a, f, b[j], ctx); | |
1453 #if 0 /* make test uses ouput in bc but bc can't handle GF(2^m) arithmetic */ | |
1454 if (bp != NULL) | |
1455 { | |
1456 if (!results) | |
1457 { | |
1458 BN_print(bp,a); | |
1459 BIO_puts(bp, " ^ ("); | |
1460 BN_print(bp,c); | |
1461 BIO_puts(bp," + "); | |
1462 BN_print(bp,d); | |
1463 BIO_puts(bp, ") = "); | |
1464 BN_print(bp,e); | |
1465 BIO_puts(bp, "; - "); | |
1466 BN_print(bp,f); | |
1467 BIO_puts(bp, " % "); | |
1468 BN_print(bp,b[j]); | |
1469 BIO_puts(bp,"\n"); | |
1470 } | |
1471 } | |
1472 #endif | |
1473 BN_GF2m_add(f, e, f); | |
1474 /* Test that a^(c+d)=a^c*a^d. */ | |
1475 if(!BN_is_zero(f)) | |
1476 { | |
1477 fprintf(stderr,"GF(2^m) modular exponentiation t
est failed!\n"); | |
1478 goto err; | |
1479 } | |
1480 } | |
1481 } | |
1482 ret = 1; | |
1483 err: | |
1484 BN_free(a); | |
1485 BN_free(b[0]); | |
1486 BN_free(b[1]); | |
1487 BN_free(c); | |
1488 BN_free(d); | |
1489 BN_free(e); | |
1490 BN_free(f); | |
1491 return ret; | |
1492 } | |
1493 | |
1494 int test_gf2m_mod_sqrt(BIO *bp,BN_CTX *ctx) | |
1495 { | |
1496 BIGNUM *a,*b[2],*c,*d,*e,*f; | |
1497 int i, j, ret = 0; | |
1498 int p0[] = {163,7,6,3,0,-1}; | |
1499 int p1[] = {193,15,0,-1}; | |
1500 | |
1501 a=BN_new(); | |
1502 b[0]=BN_new(); | |
1503 b[1]=BN_new(); | |
1504 c=BN_new(); | |
1505 d=BN_new(); | |
1506 e=BN_new(); | |
1507 f=BN_new(); | |
1508 | |
1509 BN_GF2m_arr2poly(p0, b[0]); | |
1510 BN_GF2m_arr2poly(p1, b[1]); | |
1511 | |
1512 for (i=0; i<num0; i++) | |
1513 { | |
1514 BN_bntest_rand(a, 512, 0, 0); | |
1515 for (j=0; j < 2; j++) | |
1516 { | |
1517 BN_GF2m_mod(c, a, b[j]); | |
1518 BN_GF2m_mod_sqrt(d, a, b[j], ctx); | |
1519 BN_GF2m_mod_sqr(e, d, b[j], ctx); | |
1520 #if 0 /* make test uses ouput in bc but bc can't handle GF(2^m) arithmetic */ | |
1521 if (bp != NULL) | |
1522 { | |
1523 if (!results) | |
1524 { | |
1525 BN_print(bp,d); | |
1526 BIO_puts(bp, " ^ 2 - "); | |
1527 BN_print(bp,a); | |
1528 BIO_puts(bp,"\n"); | |
1529 } | |
1530 } | |
1531 #endif | |
1532 BN_GF2m_add(f, c, e); | |
1533 /* Test that d^2 = a, where d = sqrt(a). */ | |
1534 if(!BN_is_zero(f)) | |
1535 { | |
1536 fprintf(stderr,"GF(2^m) modular square root test
failed!\n"); | |
1537 goto err; | |
1538 } | |
1539 } | |
1540 } | |
1541 ret = 1; | |
1542 err: | |
1543 BN_free(a); | |
1544 BN_free(b[0]); | |
1545 BN_free(b[1]); | |
1546 BN_free(c); | |
1547 BN_free(d); | |
1548 BN_free(e); | |
1549 BN_free(f); | |
1550 return ret; | |
1551 } | |
1552 | |
1553 int test_gf2m_mod_solve_quad(BIO *bp,BN_CTX *ctx) | |
1554 { | |
1555 BIGNUM *a,*b[2],*c,*d,*e; | |
1556 int i, j, s = 0, t, ret = 0; | |
1557 int p0[] = {163,7,6,3,0,-1}; | |
1558 int p1[] = {193,15,0,-1}; | |
1559 | |
1560 a=BN_new(); | |
1561 b[0]=BN_new(); | |
1562 b[1]=BN_new(); | |
1563 c=BN_new(); | |
1564 d=BN_new(); | |
1565 e=BN_new(); | |
1566 | |
1567 BN_GF2m_arr2poly(p0, b[0]); | |
1568 BN_GF2m_arr2poly(p1, b[1]); | |
1569 | |
1570 for (i=0; i<num0; i++) | |
1571 { | |
1572 BN_bntest_rand(a, 512, 0, 0); | |
1573 for (j=0; j < 2; j++) | |
1574 { | |
1575 t = BN_GF2m_mod_solve_quad(c, a, b[j], ctx); | |
1576 if (t) | |
1577 { | |
1578 s++; | |
1579 BN_GF2m_mod_sqr(d, c, b[j], ctx); | |
1580 BN_GF2m_add(d, c, d); | |
1581 BN_GF2m_mod(e, a, b[j]); | |
1582 #if 0 /* make test uses ouput in bc but bc can't handle GF(2^m) arithmetic */ | |
1583 if (bp != NULL) | |
1584 { | |
1585 if (!results) | |
1586 { | |
1587 BN_print(bp,c); | |
1588 BIO_puts(bp, " is root of z^2 +
z = "); | |
1589 BN_print(bp,a); | |
1590 BIO_puts(bp, " % "); | |
1591 BN_print(bp,b[j]); | |
1592 BIO_puts(bp, "\n"); | |
1593 } | |
1594 } | |
1595 #endif | |
1596 BN_GF2m_add(e, e, d); | |
1597 /* Test that solution of quadratic c satisfies c
^2 + c = a. */ | |
1598 if(!BN_is_zero(e)) | |
1599 { | |
1600 fprintf(stderr,"GF(2^m) modular solve qu
adratic test failed!\n"); | |
1601 goto err; | |
1602 } | |
1603 | |
1604 } | |
1605 else | |
1606 { | |
1607 #if 0 /* make test uses ouput in bc but bc can't handle GF(2^m) arithmetic */ | |
1608 if (bp != NULL) | |
1609 { | |
1610 if (!results) | |
1611 { | |
1612 BIO_puts(bp, "There are no roots
of z^2 + z = "); | |
1613 BN_print(bp,a); | |
1614 BIO_puts(bp, " % "); | |
1615 BN_print(bp,b[j]); | |
1616 BIO_puts(bp, "\n"); | |
1617 } | |
1618 } | |
1619 #endif | |
1620 } | |
1621 } | |
1622 } | |
1623 if (s == 0) | |
1624 { | |
1625 fprintf(stderr,"All %i tests of GF(2^m) modular solve quadratic
resulted in no roots;\n", num0); | |
1626 fprintf(stderr,"this is very unlikely and probably indicates an
error.\n"); | |
1627 goto err; | |
1628 } | |
1629 ret = 1; | |
1630 err: | |
1631 BN_free(a); | |
1632 BN_free(b[0]); | |
1633 BN_free(b[1]); | |
1634 BN_free(c); | |
1635 BN_free(d); | |
1636 BN_free(e); | |
1637 return ret; | |
1638 } | |
1639 #endif | |
1640 static int genprime_cb(int p, int n, BN_GENCB *arg) | |
1641 { | |
1642 char c='*'; | |
1643 | |
1644 if (p == 0) c='.'; | |
1645 if (p == 1) c='+'; | |
1646 if (p == 2) c='*'; | |
1647 if (p == 3) c='\n'; | |
1648 putc(c, stderr); | |
1649 fflush(stderr); | |
1650 return 1; | |
1651 } | |
1652 | |
1653 int test_kron(BIO *bp, BN_CTX *ctx) | |
1654 { | |
1655 BN_GENCB cb; | |
1656 BIGNUM *a,*b,*r,*t; | |
1657 int i; | |
1658 int legendre, kronecker; | |
1659 int ret = 0; | |
1660 | |
1661 a = BN_new(); | |
1662 b = BN_new(); | |
1663 r = BN_new(); | |
1664 t = BN_new(); | |
1665 if (a == NULL || b == NULL || r == NULL || t == NULL) goto err; | |
1666 | |
1667 BN_GENCB_set(&cb, genprime_cb, NULL); | |
1668 | |
1669 /* We test BN_kronecker(a, b, ctx) just for b odd (Jacobi symbol). | |
1670 * In this case we know that if b is prime, then BN_kronecker(a, b, ct
x) | |
1671 * is congruent to $a^{(b-1)/2}$, modulo $b$ (Legendre symbol). | |
1672 * So we generate a random prime b and compare these values | |
1673 * for a number of random a's. (That is, we run the Solovay-Strassen | |
1674 * primality test to confirm that b is prime, except that we | |
1675 * don't want to test whether b is prime but whether BN_kronecker | |
1676 * works.) */ | |
1677 | |
1678 if (!BN_generate_prime_ex(b, 512, 0, NULL, NULL, &cb)) goto err; | |
1679 b->neg = rand_neg(); | |
1680 putc('\n', stderr); | |
1681 | |
1682 for (i = 0; i < num0; i++) | |
1683 { | |
1684 if (!BN_bntest_rand(a, 512, 0, 0)) goto err; | |
1685 a->neg = rand_neg(); | |
1686 | |
1687 /* t := (|b|-1)/2 (note that b is odd) */ | |
1688 if (!BN_copy(t, b)) goto err; | |
1689 t->neg = 0; | |
1690 if (!BN_sub_word(t, 1)) goto err; | |
1691 if (!BN_rshift1(t, t)) goto err; | |
1692 /* r := a^t mod b */ | |
1693 b->neg=0; | |
1694 | |
1695 if (!BN_mod_exp_recp(r, a, t, b, ctx)) goto err; | |
1696 b->neg=1; | |
1697 | |
1698 if (BN_is_word(r, 1)) | |
1699 legendre = 1; | |
1700 else if (BN_is_zero(r)) | |
1701 legendre = 0; | |
1702 else | |
1703 { | |
1704 if (!BN_add_word(r, 1)) goto err; | |
1705 if (0 != BN_ucmp(r, b)) | |
1706 { | |
1707 fprintf(stderr, "Legendre symbol computation fai
led\n"); | |
1708 goto err; | |
1709 } | |
1710 legendre = -1; | |
1711 } | |
1712 | |
1713 kronecker = BN_kronecker(a, b, ctx); | |
1714 if (kronecker < -1) goto err; | |
1715 /* we actually need BN_kronecker(a, |b|) */ | |
1716 if (a->neg && b->neg) | |
1717 kronecker = -kronecker; | |
1718 | |
1719 if (legendre != kronecker) | |
1720 { | |
1721 fprintf(stderr, "legendre != kronecker; a = "); | |
1722 BN_print_fp(stderr, a); | |
1723 fprintf(stderr, ", b = "); | |
1724 BN_print_fp(stderr, b); | |
1725 fprintf(stderr, "\n"); | |
1726 goto err; | |
1727 } | |
1728 | |
1729 putc('.', stderr); | |
1730 fflush(stderr); | |
1731 } | |
1732 | |
1733 putc('\n', stderr); | |
1734 fflush(stderr); | |
1735 ret = 1; | |
1736 err: | |
1737 if (a != NULL) BN_free(a); | |
1738 if (b != NULL) BN_free(b); | |
1739 if (r != NULL) BN_free(r); | |
1740 if (t != NULL) BN_free(t); | |
1741 return ret; | |
1742 } | |
1743 | |
1744 int test_sqrt(BIO *bp, BN_CTX *ctx) | |
1745 { | |
1746 BN_GENCB cb; | |
1747 BIGNUM *a,*p,*r; | |
1748 int i, j; | |
1749 int ret = 0; | |
1750 | |
1751 a = BN_new(); | |
1752 p = BN_new(); | |
1753 r = BN_new(); | |
1754 if (a == NULL || p == NULL || r == NULL) goto err; | |
1755 | |
1756 BN_GENCB_set(&cb, genprime_cb, NULL); | |
1757 | |
1758 for (i = 0; i < 16; i++) | |
1759 { | |
1760 if (i < 8) | |
1761 { | |
1762 unsigned primes[8] = { 2, 3, 5, 7, 11, 13, 17, 19 }; | |
1763 | |
1764 if (!BN_set_word(p, primes[i])) goto err; | |
1765 } | |
1766 else | |
1767 { | |
1768 if (!BN_set_word(a, 32)) goto err; | |
1769 if (!BN_set_word(r, 2*i + 1)) goto err; | |
1770 | |
1771 if (!BN_generate_prime_ex(p, 256, 0, a, r, &cb)) goto er
r; | |
1772 putc('\n', stderr); | |
1773 } | |
1774 p->neg = rand_neg(); | |
1775 | |
1776 for (j = 0; j < num2; j++) | |
1777 { | |
1778 /* construct 'a' such that it is a square modulo p, | |
1779 * but in general not a proper square and not reduced mo
dulo p */ | |
1780 if (!BN_bntest_rand(r, 256, 0, 3)) goto err; | |
1781 if (!BN_nnmod(r, r, p, ctx)) goto err; | |
1782 if (!BN_mod_sqr(r, r, p, ctx)) goto err; | |
1783 if (!BN_bntest_rand(a, 256, 0, 3)) goto err; | |
1784 if (!BN_nnmod(a, a, p, ctx)) goto err; | |
1785 if (!BN_mod_sqr(a, a, p, ctx)) goto err; | |
1786 if (!BN_mul(a, a, r, ctx)) goto err; | |
1787 if (rand_neg()) | |
1788 if (!BN_sub(a, a, p)) goto err; | |
1789 | |
1790 if (!BN_mod_sqrt(r, a, p, ctx)) goto err; | |
1791 if (!BN_mod_sqr(r, r, p, ctx)) goto err; | |
1792 | |
1793 if (!BN_nnmod(a, a, p, ctx)) goto err; | |
1794 | |
1795 if (BN_cmp(a, r) != 0) | |
1796 { | |
1797 fprintf(stderr, "BN_mod_sqrt failed: a = "); | |
1798 BN_print_fp(stderr, a); | |
1799 fprintf(stderr, ", r = "); | |
1800 BN_print_fp(stderr, r); | |
1801 fprintf(stderr, ", p = "); | |
1802 BN_print_fp(stderr, p); | |
1803 fprintf(stderr, "\n"); | |
1804 goto err; | |
1805 } | |
1806 | |
1807 putc('.', stderr); | |
1808 fflush(stderr); | |
1809 } | |
1810 | |
1811 putc('\n', stderr); | |
1812 fflush(stderr); | |
1813 } | |
1814 ret = 1; | |
1815 err: | |
1816 if (a != NULL) BN_free(a); | |
1817 if (p != NULL) BN_free(p); | |
1818 if (r != NULL) BN_free(r); | |
1819 return ret; | |
1820 } | |
1821 | |
1822 int test_lshift(BIO *bp,BN_CTX *ctx,BIGNUM *a_) | |
1823 { | |
1824 BIGNUM *a,*b,*c,*d; | |
1825 int i; | |
1826 | |
1827 b=BN_new(); | |
1828 c=BN_new(); | |
1829 d=BN_new(); | |
1830 BN_one(c); | |
1831 | |
1832 if(a_) | |
1833 a=a_; | |
1834 else | |
1835 { | |
1836 a=BN_new(); | |
1837 BN_bntest_rand(a,200,0,0); /**/ | |
1838 a->neg=rand_neg(); | |
1839 } | |
1840 for (i=0; i<num0; i++) | |
1841 { | |
1842 BN_lshift(b,a,i+1); | |
1843 BN_add(c,c,c); | |
1844 if (bp != NULL) | |
1845 { | |
1846 if (!results) | |
1847 { | |
1848 BN_print(bp,a); | |
1849 BIO_puts(bp," * "); | |
1850 BN_print(bp,c); | |
1851 BIO_puts(bp," - "); | |
1852 } | |
1853 BN_print(bp,b); | |
1854 BIO_puts(bp,"\n"); | |
1855 } | |
1856 BN_mul(d,a,c,ctx); | |
1857 BN_sub(d,d,b); | |
1858 if(!BN_is_zero(d)) | |
1859 { | |
1860 fprintf(stderr,"Left shift test failed!\n"); | |
1861 fprintf(stderr,"a="); | |
1862 BN_print_fp(stderr,a); | |
1863 fprintf(stderr,"\nb="); | |
1864 BN_print_fp(stderr,b); | |
1865 fprintf(stderr,"\nc="); | |
1866 BN_print_fp(stderr,c); | |
1867 fprintf(stderr,"\nd="); | |
1868 BN_print_fp(stderr,d); | |
1869 fprintf(stderr,"\n"); | |
1870 return 0; | |
1871 } | |
1872 } | |
1873 BN_free(a); | |
1874 BN_free(b); | |
1875 BN_free(c); | |
1876 BN_free(d); | |
1877 return(1); | |
1878 } | |
1879 | |
1880 int test_lshift1(BIO *bp) | |
1881 { | |
1882 BIGNUM *a,*b,*c; | |
1883 int i; | |
1884 | |
1885 a=BN_new(); | |
1886 b=BN_new(); | |
1887 c=BN_new(); | |
1888 | |
1889 BN_bntest_rand(a,200,0,0); /**/ | |
1890 a->neg=rand_neg(); | |
1891 for (i=0; i<num0; i++) | |
1892 { | |
1893 BN_lshift1(b,a); | |
1894 if (bp != NULL) | |
1895 { | |
1896 if (!results) | |
1897 { | |
1898 BN_print(bp,a); | |
1899 BIO_puts(bp," * 2"); | |
1900 BIO_puts(bp," - "); | |
1901 } | |
1902 BN_print(bp,b); | |
1903 BIO_puts(bp,"\n"); | |
1904 } | |
1905 BN_add(c,a,a); | |
1906 BN_sub(a,b,c); | |
1907 if(!BN_is_zero(a)) | |
1908 { | |
1909 fprintf(stderr,"Left shift one test failed!\n"); | |
1910 return 0; | |
1911 } | |
1912 | |
1913 BN_copy(a,b); | |
1914 } | |
1915 BN_free(a); | |
1916 BN_free(b); | |
1917 BN_free(c); | |
1918 return(1); | |
1919 } | |
1920 | |
1921 int test_rshift(BIO *bp,BN_CTX *ctx) | |
1922 { | |
1923 BIGNUM *a,*b,*c,*d,*e; | |
1924 int i; | |
1925 | |
1926 a=BN_new(); | |
1927 b=BN_new(); | |
1928 c=BN_new(); | |
1929 d=BN_new(); | |
1930 e=BN_new(); | |
1931 BN_one(c); | |
1932 | |
1933 BN_bntest_rand(a,200,0,0); /**/ | |
1934 a->neg=rand_neg(); | |
1935 for (i=0; i<num0; i++) | |
1936 { | |
1937 BN_rshift(b,a,i+1); | |
1938 BN_add(c,c,c); | |
1939 if (bp != NULL) | |
1940 { | |
1941 if (!results) | |
1942 { | |
1943 BN_print(bp,a); | |
1944 BIO_puts(bp," / "); | |
1945 BN_print(bp,c); | |
1946 BIO_puts(bp," - "); | |
1947 } | |
1948 BN_print(bp,b); | |
1949 BIO_puts(bp,"\n"); | |
1950 } | |
1951 BN_div(d,e,a,c,ctx); | |
1952 BN_sub(d,d,b); | |
1953 if(!BN_is_zero(d)) | |
1954 { | |
1955 fprintf(stderr,"Right shift test failed!\n"); | |
1956 return 0; | |
1957 } | |
1958 } | |
1959 BN_free(a); | |
1960 BN_free(b); | |
1961 BN_free(c); | |
1962 BN_free(d); | |
1963 BN_free(e); | |
1964 return(1); | |
1965 } | |
1966 | |
1967 int test_rshift1(BIO *bp) | |
1968 { | |
1969 BIGNUM *a,*b,*c; | |
1970 int i; | |
1971 | |
1972 a=BN_new(); | |
1973 b=BN_new(); | |
1974 c=BN_new(); | |
1975 | |
1976 BN_bntest_rand(a,200,0,0); /**/ | |
1977 a->neg=rand_neg(); | |
1978 for (i=0; i<num0; i++) | |
1979 { | |
1980 BN_rshift1(b,a); | |
1981 if (bp != NULL) | |
1982 { | |
1983 if (!results) | |
1984 { | |
1985 BN_print(bp,a); | |
1986 BIO_puts(bp," / 2"); | |
1987 BIO_puts(bp," - "); | |
1988 } | |
1989 BN_print(bp,b); | |
1990 BIO_puts(bp,"\n"); | |
1991 } | |
1992 BN_sub(c,a,b); | |
1993 BN_sub(c,c,b); | |
1994 if(!BN_is_zero(c) && !BN_abs_is_word(c, 1)) | |
1995 { | |
1996 fprintf(stderr,"Right shift one test failed!\n"); | |
1997 return 0; | |
1998 } | |
1999 BN_copy(a,b); | |
2000 } | |
2001 BN_free(a); | |
2002 BN_free(b); | |
2003 BN_free(c); | |
2004 return(1); | |
2005 } | |
2006 | |
2007 int rand_neg(void) | |
2008 { | |
2009 static unsigned int neg=0; | |
2010 static int sign[8]={0,0,0,1,1,0,1,1}; | |
2011 | |
2012 return(sign[(neg++)%8]); | |
2013 } | |
OLD | NEW |