bntest.c 20.0 KB
Newer Older
1
/* crypto/bn/bntest.c */
2
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
 * All rights reserved.
 *
 * This package is an SSL implementation written
 * by Eric Young (eay@cryptsoft.com).
 * The implementation was written so as to conform with Netscapes SSL.
 * 
 * This library is free for commercial and non-commercial use as long as
 * the following conditions are aheared to.  The following conditions
 * apply to all code found in this distribution, be it the RC4, RSA,
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 * included with this distribution is covered by the same copyright terms
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 * 
 * Copyright remains Eric Young's, and as such any Copyright notices in
 * the code are not to be removed.
 * If this package is used in a product, Eric Young should be given attribution
 * as the author of the parts of the library used.
 * This can be in the form of a textual message at program startup or
 * in documentation (online or textual) provided with the package.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. All advertising materials mentioning features or use of this software
 *    must display the following acknowledgement:
 *    "This product includes cryptographic software written by
 *     Eric Young (eay@cryptsoft.com)"
 *    The word 'cryptographic' can be left out if the rouines from the library
 *    being used are not cryptographic related :-).
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 *    the apps directory (application code) you must include an acknowledgement:
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 * 
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * 
 * The licence and distribution terms for any publically available version or
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 * copied and put under another distribution licence
 * [including the GNU Public Licence.]
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
62

63
#include "openssl/e_os.h"
64

65 66 67 68 69
#include <openssl/bio.h>
#include <openssl/bn.h>
#include <openssl/rand.h>
#include <openssl/x509.h>
#include <openssl/err.h>
70

71 72 73 74
#ifdef WINDOWS
#include "../bio/bss_file.c"
#endif

75 76 77
const int num0 = 100; /* number of tests */
const int num1 = 50;  /* additional tests for some functions */
const int num2 = 5;   /* number of tests for slow functions */
78

79 80 81
int test_add(BIO *bp);
int test_sub(BIO *bp);
int test_lshift1(BIO *bp);
B
Ben Laurie 已提交
82
int test_lshift(BIO *bp,BN_CTX *ctx,BIGNUM *a_);
83
int test_rshift1(BIO *bp);
B
Ben Laurie 已提交
84
int test_rshift(BIO *bp,BN_CTX *ctx);
85 86 87 88 89 90 91 92
int test_div(BIO *bp,BN_CTX *ctx);
int test_div_recp(BIO *bp,BN_CTX *ctx);
int test_mul(BIO *bp);
int test_sqr(BIO *bp,BN_CTX *ctx);
int test_mont(BIO *bp,BN_CTX *ctx);
int test_mod(BIO *bp,BN_CTX *ctx);
int test_mod_mul(BIO *bp,BN_CTX *ctx);
int test_mod_exp(BIO *bp,BN_CTX *ctx);
93
int test_exp(BIO *bp,BN_CTX *ctx);
94 95 96
int rand_neg(void);
static int results=0;

97
#ifdef NO_STDIO
98
#define APPS_WIN16
99
#include "bss_file.c"
100 101
#endif

102
static unsigned char lst[]="\xC6\x4F\x43\x04\x2A\xEA\xCA\x6E\x58\x36\x80\x5B\xE8\xC9"
B
Ben Laurie 已提交
103 104
"\x9B\x04\x5D\x48\x36\xC2\xFD\x16\xC9\x64\xF0";

105 106
static const char rnd_seed[] = "string to make the random number generator think it has entropy";

107
static void message(BIO *out, char *m)
108 109
	{
	fprintf(stderr, "test %s\n", m);
U
Ulf Möller 已提交
110
#if defined(linux) || defined(__FreeBSD__) /* can we use GNU bc features? */
111 112 113 114 115 116
	BIO_puts(out, "print \"test ");
	BIO_puts(out, m);
	BIO_puts(out, "\\n\"\n");
#endif
	}

U
Ulf Möller 已提交
117
int main(int argc, char *argv[])
118 119 120 121 122
	{
	BN_CTX *ctx;
	BIO *out;
	char *outfile=NULL;

123 124
	results = 0;

125 126 127 128
	RAND_seed(rnd_seed, sizeof rnd_seed); /* or BN_rand may fail, and we don't
	                                       * even check its return value
	                                       * (which we should) */

129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165
	argc--;
	argv++;
	while (argc >= 1)
		{
		if (strcmp(*argv,"-results") == 0)
			results=1;
		else if (strcmp(*argv,"-out") == 0)
			{
			if (--argc < 1) break;
			outfile= *(++argv);
			}
		argc--;
		argv++;
		}


	ctx=BN_CTX_new();
	if (ctx == NULL) exit(1);

	out=BIO_new(BIO_s_file());
	if (out == NULL) exit(1);
	if (outfile == NULL)
		{
		BIO_set_fp(out,stdout,BIO_NOCLOSE);
		}
	else
		{
		if (!BIO_write_filename(out,outfile))
			{
			perror(outfile);
			exit(1);
			}
		}

	if (!results)
		BIO_puts(out,"obase=16\nibase=16\n");

166
	message(out,"BN_add");
167
	if (!test_add(out)) goto err;
168
	BIO_flush(out);
169

170
	message(out,"BN_sub");
171
	if (!test_sub(out)) goto err;
172
	BIO_flush(out);
173

174
	message(out,"BN_lshift1");
175
	if (!test_lshift1(out)) goto err;
176
	BIO_flush(out);
177

178
	message(out,"BN_lshift (fixed)");
179
	if (!test_lshift(out,ctx,BN_bin2bn(lst,sizeof(lst)-1,NULL)))
B
Ben Laurie 已提交
180
	    goto err;
181
	BIO_flush(out);
B
Ben Laurie 已提交
182

183
	message(out,"BN_lshift");
B
Ben Laurie 已提交
184
	if (!test_lshift(out,ctx,NULL)) goto err;
185
	BIO_flush(out);
186

187
	message(out,"BN_rshift1");
188
	if (!test_rshift1(out)) goto err;
189
	BIO_flush(out);
190

191
	message(out,"BN_rshift");
B
Ben Laurie 已提交
192
	if (!test_rshift(out,ctx)) goto err;
193
	BIO_flush(out);
194

195
	message(out,"BN_sqr");
196
	if (!test_sqr(out,ctx)) goto err;
197
	BIO_flush(out);
198

199
	message(out,"BN_mul");
200
	if (!test_mul(out)) goto err;
201
	BIO_flush(out);
202

203
	message(out,"BN_div");
204
	if (!test_div(out,ctx)) goto err;
205
	BIO_flush(out);
206

207
	message(out,"BN_div_recp");
208
	if (!test_div_recp(out,ctx)) goto err;
209
	BIO_flush(out);
210

211
	message(out,"BN_mod");
212
	if (!test_mod(out,ctx)) goto err;
213
	BIO_flush(out);
214

215
	message(out,"BN_mod_mul");
216
	if (!test_mod_mul(out,ctx)) goto err;
217
	BIO_flush(out);
218

219
	message(out,"BN_mont");
220
	if (!test_mont(out,ctx)) goto err;
221
	BIO_flush(out);
B
Bodo Möller 已提交
222

223
	message(out,"BN_mod_exp");
224
	if (!test_mod_exp(out,ctx)) goto err;
225
	BIO_flush(out);
226

227
	message(out,"BN_exp");
228
	if (!test_exp(out,ctx)) goto err;
229
	BIO_flush(out);
230

231 232 233
	BN_CTX_free(ctx);
	BIO_free(out);

234 235 236
/**/
	exit(0);
err:
237
	BIO_puts(out,"1\n"); /* make sure bc fails if we are piping to it */
238
	BIO_flush(out);
239
	ERR_load_crypto_strings();
240
	ERR_print_errors_fp(stderr);
241 242 243 244
	exit(1);
	return(1);
	}

U
Ulf Möller 已提交
245
int test_add(BIO *bp)
246
	{
247
	BIGNUM a,b,c;
248 249 250
	int i;
	int j;

251 252 253
	BN_init(&a);
	BN_init(&b);
	BN_init(&c);
254

255
	BN_rand(&a,512,0,0);
256
	for (i=0; i<num0; i++)
257
		{
258 259 260
		BN_rand(&b,450+i,0,0);
		a.neg=rand_neg();
		b.neg=rand_neg();
261 262
		if (bp == NULL)
			for (j=0; j<10000; j++)
263 264
				BN_add(&c,&a,&b);
		BN_add(&c,&a,&b);
265 266 267 268
		if (bp != NULL)
			{
			if (!results)
				{
269
				BN_print(bp,&a);
270
				BIO_puts(bp," + ");
271
				BN_print(bp,&b);
272 273
				BIO_puts(bp," - ");
				}
274
			BN_print(bp,&c);
275 276
			BIO_puts(bp,"\n");
			}
B
Ben Laurie 已提交
277 278 279 280 281 282
		a.neg=!a.neg;
		b.neg=!b.neg;
		BN_add(&c,&c,&b);
		BN_add(&c,&c,&a);
		if(!BN_is_zero(&c))
		    {
283
		    fprintf(stderr,"Add test failed!\n");
B
Ben Laurie 已提交
284 285
		    return 0;
		    }
286
		}
287 288 289
	BN_free(&a);
	BN_free(&b);
	BN_free(&c);
290 291 292
	return(1);
	}

U
Ulf Möller 已提交
293
int test_sub(BIO *bp)
294
	{
295
	BIGNUM a,b,c;
296 297 298
	int i;
	int j;

299 300 301
	BN_init(&a);
	BN_init(&b);
	BN_init(&c);
302

303
	for (i=0; i<num0+num1; i++)
304
		{
305 306 307 308 309 310 311 312 313 314 315 316 317
		if (i < num1)
			{
			BN_rand(&a,512,0,0);
			BN_copy(&b,&a);
			if (BN_set_bit(&a,i)==0) return(0);
			BN_add_word(&b,i);
			}
		else
			{
			BN_rand(&b,400+i-num1,0,0);
			a.neg=rand_neg();
			b.neg=rand_neg();
			}
318 319
		if (bp == NULL)
			for (j=0; j<10000; j++)
320 321
				BN_sub(&c,&a,&b);
		BN_sub(&c,&a,&b);
322 323 324 325
		if (bp != NULL)
			{
			if (!results)
				{
326
				BN_print(bp,&a);
327
				BIO_puts(bp," - ");
328
				BN_print(bp,&b);
329 330
				BIO_puts(bp," - ");
				}
331
			BN_print(bp,&c);
332 333
			BIO_puts(bp,"\n");
			}
B
Ben Laurie 已提交
334 335 336 337
		BN_add(&c,&c,&b);
		BN_sub(&c,&c,&a);
		if(!BN_is_zero(&c))
		    {
338
		    fprintf(stderr,"Subtract test failed!\n");
B
Ben Laurie 已提交
339 340
		    return 0;
		    }
341
		}
342 343 344
	BN_free(&a);
	BN_free(&b);
	BN_free(&c);
345 346 347
	return(1);
	}

U
Ulf Möller 已提交
348
int test_div(BIO *bp, BN_CTX *ctx)
349
	{
B
Ben Laurie 已提交
350
	BIGNUM a,b,c,d,e;
351 352 353
	int i;
	int j;

354 355 356 357
	BN_init(&a);
	BN_init(&b);
	BN_init(&c);
	BN_init(&d);
B
Ben Laurie 已提交
358
	BN_init(&e);
359

360
	for (i=0; i<num0+num1; i++)
361
		{
362 363 364 365 366 367 368 369 370
		if (i < num1)
			{
			BN_rand(&a,400,0,0);
			BN_copy(&b,&a);
			BN_lshift(&a,&a,i);
			BN_add_word(&a,i);
			}
		else
			BN_rand(&b,50+3*(i-num1),0,0);
371 372
		a.neg=rand_neg();
		b.neg=rand_neg();
373 374
		if (bp == NULL)
			for (j=0; j<100; j++)
375 376
				BN_div(&d,&c,&a,&b,ctx);
		BN_div(&d,&c,&a,&b,ctx);
377 378 379 380
		if (bp != NULL)
			{
			if (!results)
				{
381
				BN_print(bp,&a);
382
				BIO_puts(bp," / ");
383
				BN_print(bp,&b);
384 385
				BIO_puts(bp," - ");
				}
386
			BN_print(bp,&d);
387 388 389 390
			BIO_puts(bp,"\n");

			if (!results)
				{
391
				BN_print(bp,&a);
392
				BIO_puts(bp," % ");
393
				BN_print(bp,&b);
394 395
				BIO_puts(bp," - ");
				}
396
			BN_print(bp,&c);
397 398
			BIO_puts(bp,"\n");
			}
B
Ben Laurie 已提交
399 400 401 402 403
		BN_mul(&e,&d,&b,ctx);
		BN_add(&d,&e,&c);
		BN_sub(&d,&d,&a);
		if(!BN_is_zero(&d))
		    {
404
		    fprintf(stderr,"Division test failed!\n");
B
Ben Laurie 已提交
405 406
		    return 0;
		    }
407
		}
408 409 410 411
	BN_free(&a);
	BN_free(&b);
	BN_free(&c);
	BN_free(&d);
B
Ben Laurie 已提交
412
	BN_free(&e);
413 414 415
	return(1);
	}

U
Ulf Möller 已提交
416
int test_div_recp(BIO *bp, BN_CTX *ctx)
417
	{
B
Ben Laurie 已提交
418
	BIGNUM a,b,c,d,e;
419 420 421 422 423 424 425 426 427
	BN_RECP_CTX recp;
	int i;
	int j;

	BN_RECP_CTX_init(&recp);
	BN_init(&a);
	BN_init(&b);
	BN_init(&c);
	BN_init(&d);
B
Ben Laurie 已提交
428
	BN_init(&e);
429

430
	for (i=0; i<num0+num1; i++)
431
		{
432 433 434 435 436 437 438 439 440
		if (i < num1)
			{
			BN_rand(&a,400,0,0);
			BN_copy(&b,&a);
			BN_lshift(&a,&a,i);
			BN_add_word(&a,i);
			}
		else
			BN_rand(&b,50+3*(i-num1),0,0);
441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469
		a.neg=rand_neg();
		b.neg=rand_neg();
		BN_RECP_CTX_set(&recp,&b,ctx);
		if (bp == NULL)
			for (j=0; j<100; j++)
				BN_div_recp(&d,&c,&a,&recp,ctx);
		BN_div_recp(&d,&c,&a,&recp,ctx);
		if (bp != NULL)
			{
			if (!results)
				{
				BN_print(bp,&a);
				BIO_puts(bp," / ");
				BN_print(bp,&b);
				BIO_puts(bp," - ");
				}
			BN_print(bp,&d);
			BIO_puts(bp,"\n");

			if (!results)
				{
				BN_print(bp,&a);
				BIO_puts(bp," % ");
				BN_print(bp,&b);
				BIO_puts(bp," - ");
				}
			BN_print(bp,&c);
			BIO_puts(bp,"\n");
			}
B
Ben Laurie 已提交
470 471 472 473 474
		BN_mul(&e,&d,&b,ctx);
		BN_add(&d,&e,&c);
		BN_sub(&d,&d,&a);
		if(!BN_is_zero(&d))
		    {
475 476 477 478 479 480
		    fprintf(stderr,"Reciprocal division test failed!\n");
		    fprintf(stderr,"a=");
		    BN_print_fp(stderr,&a);
		    fprintf(stderr,"\nb=");
		    BN_print_fp(stderr,&b);
		    fprintf(stderr,"\n");
B
Ben Laurie 已提交
481 482
		    return 0;
		    }
483 484 485 486 487
		}
	BN_free(&a);
	BN_free(&b);
	BN_free(&c);
	BN_free(&d);
B
Ben Laurie 已提交
488
	BN_free(&e);
489
	BN_RECP_CTX_free(&recp);
490 491 492
	return(1);
	}

U
Ulf Möller 已提交
493
int test_mul(BIO *bp)
494
	{
B
Ben Laurie 已提交
495
	BIGNUM a,b,c,d,e;
496 497
	int i;
	int j;
498
	BN_CTX ctx;
499

500 501 502 503
	BN_CTX_init(&ctx);
	BN_init(&a);
	BN_init(&b);
	BN_init(&c);
B
Ben Laurie 已提交
504 505
	BN_init(&d);
	BN_init(&e);
506

507
	for (i=0; i<num0+num1; i++)
508
		{
509 510 511 512 513 514 515
		if (i < num1)
			{
			BN_rand(&a,100,0,0);
			BN_rand(&b,100,0,0);
			}
		else
			BN_rand(&b,i-num1,0,0);
516 517
		a.neg=rand_neg();
		b.neg=rand_neg();
518 519
		if (bp == NULL)
			for (j=0; j<100; j++)
520 521
				BN_mul(&c,&a,&b,&ctx);
		BN_mul(&c,&a,&b,&ctx);
522 523 524 525
		if (bp != NULL)
			{
			if (!results)
				{
526
				BN_print(bp,&a);
527
				BIO_puts(bp," * ");
528
				BN_print(bp,&b);
529 530
				BIO_puts(bp," - ");
				}
531
			BN_print(bp,&c);
532 533
			BIO_puts(bp,"\n");
			}
B
Ben Laurie 已提交
534 535 536 537
		BN_div(&d,&e,&c,&a,&ctx);
		BN_sub(&d,&d,&b);
		if(!BN_is_zero(&d) || !BN_is_zero(&e))
		    {
538
		    fprintf(stderr,"Multiplication test failed!\n");
B
Ben Laurie 已提交
539 540
		    return 0;
		    }
541
		}
542 543 544
	BN_free(&a);
	BN_free(&b);
	BN_free(&c);
B
Ben Laurie 已提交
545 546
	BN_free(&d);
	BN_free(&e);
547
	BN_CTX_free(&ctx);
548 549 550
	return(1);
	}

U
Ulf Möller 已提交
551
int test_sqr(BIO *bp, BN_CTX *ctx)
552
	{
B
Ben Laurie 已提交
553
	BIGNUM a,c,d,e;
554 555 556
	int i;
	int j;

557 558
	BN_init(&a);
	BN_init(&c);
B
Ben Laurie 已提交
559 560
	BN_init(&d);
	BN_init(&e);
561

562
	for (i=0; i<num0; i++)
563
		{
564 565
		BN_rand(&a,40+i*10,0,0);
		a.neg=rand_neg();
566 567
		if (bp == NULL)
			for (j=0; j<100; j++)
568 569
				BN_sqr(&c,&a,ctx);
		BN_sqr(&c,&a,ctx);
570 571 572 573
		if (bp != NULL)
			{
			if (!results)
				{
574
				BN_print(bp,&a);
575
				BIO_puts(bp," * ");
576
				BN_print(bp,&a);
577 578
				BIO_puts(bp," - ");
				}
579
			BN_print(bp,&c);
580 581
			BIO_puts(bp,"\n");
			}
B
Ben Laurie 已提交
582 583 584 585
		BN_div(&d,&e,&c,&a,ctx);
		BN_sub(&d,&d,&a);
		if(!BN_is_zero(&d) || !BN_is_zero(&e))
		    {
586
		    fprintf(stderr,"Square test failed!\n");
B
Ben Laurie 已提交
587 588
		    return 0;
		    }
589
		}
590 591
	BN_free(&a);
	BN_free(&c);
B
Ben Laurie 已提交
592 593
	BN_free(&d);
	BN_free(&e);
594 595 596
	return(1);
	}

U
Ulf Möller 已提交
597
int test_mont(BIO *bp, BN_CTX *ctx)
598
	{
B
Ben Laurie 已提交
599
	BIGNUM a,b,c,d,A,B;
600
	BIGNUM n;
601 602 603 604
	int i;
	int j;
	BN_MONT_CTX *mont;

605 606 607
	BN_init(&a);
	BN_init(&b);
	BN_init(&c);
B
Ben Laurie 已提交
608
	BN_init(&d);
609 610 611
	BN_init(&A);
	BN_init(&B);
	BN_init(&n);
612 613 614

	mont=BN_MONT_CTX_new();

615 616
	BN_rand(&a,100,0,0); /**/
	BN_rand(&b,100,0,0); /**/
617
	for (i=0; i<num2; i++)
618
		{
619
		int bits = (200*(i+1))/num2;
B
Bodo Möller 已提交
620 621 622 623

		if (bits == 0)
			continue;
		BN_rand(&n,bits,0,1);
624
		BN_MONT_CTX_set(mont,&n,ctx);
625

626 627
		BN_to_montgomery(&A,&a,mont,ctx);
		BN_to_montgomery(&B,&b,mont,ctx);
628 629 630

		if (bp == NULL)
			for (j=0; j<100; j++)
631 632 633
				BN_mod_mul_montgomery(&c,&A,&B,mont,ctx);/**/
		BN_mod_mul_montgomery(&c,&A,&B,mont,ctx);/**/
		BN_from_montgomery(&A,&c,mont,ctx);/**/
634 635 636 637 638 639
		if (bp != NULL)
			{
			if (!results)
				{
#ifdef undef
fprintf(stderr,"%d * %d %% %d\n",
640 641
BN_num_bits(&a),
BN_num_bits(&b),
642 643
BN_num_bits(mont->N));
#endif
644
				BN_print(bp,&a);
645
				BIO_puts(bp," * ");
646
				BN_print(bp,&b);
647
				BIO_puts(bp," % ");
648
				BN_print(bp,&(mont->N));
649 650
				BIO_puts(bp," - ");
				}
651
			BN_print(bp,&A);
652 653
			BIO_puts(bp,"\n");
			}
B
Ben Laurie 已提交
654 655 656 657
		BN_mod_mul(&d,&a,&b,&n,ctx);
		BN_sub(&d,&d,&A);
		if(!BN_is_zero(&d))
		    {
658
		    fprintf(stderr,"Montgomery multiplication test failed!\n");
B
Ben Laurie 已提交
659 660
		    return 0;
		    }
661 662
		}
	BN_MONT_CTX_free(mont);
663 664 665
	BN_free(&a);
	BN_free(&b);
	BN_free(&c);
B
Ben Laurie 已提交
666 667 668 669
	BN_free(&d);
	BN_free(&A);
	BN_free(&B);
	BN_free(&n);
670 671 672
	return(1);
	}

U
Ulf Möller 已提交
673
int test_mod(BIO *bp, BN_CTX *ctx)
674
	{
B
Ben Laurie 已提交
675
	BIGNUM *a,*b,*c,*d,*e;
676 677 678 679 680 681
	int i;
	int j;

	a=BN_new();
	b=BN_new();
	c=BN_new();
B
Ben Laurie 已提交
682 683
	d=BN_new();
	e=BN_new();
684 685

	BN_rand(a,1024,0,0); /**/
686
	for (i=0; i<num0; i++)
687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706
		{
		BN_rand(b,450+i*10,0,0); /**/
		a->neg=rand_neg();
		b->neg=rand_neg();
		if (bp == NULL)
			for (j=0; j<100; j++)
				BN_mod(c,a,b,ctx);/**/
		BN_mod(c,a,b,ctx);/**/
		if (bp != NULL)
			{
			if (!results)
				{
				BN_print(bp,a);
				BIO_puts(bp," % ");
				BN_print(bp,b);
				BIO_puts(bp," - ");
				}
			BN_print(bp,c);
			BIO_puts(bp,"\n");
			}
B
Ben Laurie 已提交
707 708 709 710
		BN_div(d,e,a,b,ctx);
		BN_sub(e,e,c);
		if(!BN_is_zero(e))
		    {
711
		    fprintf(stderr,"Modulo test failed!\n");
B
Ben Laurie 已提交
712 713
		    return 0;
		    }
714 715 716 717
		}
	BN_free(a);
	BN_free(b);
	BN_free(c);
B
Ben Laurie 已提交
718 719
	BN_free(d);
	BN_free(e);
720 721 722
	return(1);
	}

U
Ulf Möller 已提交
723
int test_mod_mul(BIO *bp, BN_CTX *ctx)
724 725 726 727 728 729 730 731 732 733 734
	{
	BIGNUM *a,*b,*c,*d,*e;
	int i;

	a=BN_new();
	b=BN_new();
	c=BN_new();
	d=BN_new();
	e=BN_new();

	BN_rand(c,1024,0,0); /**/
735
	for (i=0; i<num0; i++)
736
		{
U
Ulf Möller 已提交
737 738
		BN_rand(a,475+i*10,0,0); /**/
		BN_rand(b,425+i*11,0,0); /**/
739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767
		a->neg=rand_neg();
		b->neg=rand_neg();
	/*	if (bp == NULL)
			for (j=0; j<100; j++)
				BN_mod_mul(d,a,b,c,ctx);*/ /**/

		if (!BN_mod_mul(e,a,b,c,ctx))
			{
			unsigned long l;

			while ((l=ERR_get_error()))
				fprintf(stderr,"ERROR:%s\n",
					ERR_error_string(l,NULL));
			exit(1);
			}
		if (bp != NULL)
			{
			if (!results)
				{
				BN_print(bp,a);
				BIO_puts(bp," * ");
				BN_print(bp,b);
				BIO_puts(bp," % ");
				BN_print(bp,c);
				BIO_puts(bp," - ");
				}
			BN_print(bp,e);
			BIO_puts(bp,"\n");
			}
B
Ben Laurie 已提交
768 769 770 771 772
		BN_mul(d,a,b,ctx);
		BN_sub(d,d,e);
		BN_div(a,b,d,c,ctx);
		if(!BN_is_zero(b))
		    {
773
		    fprintf(stderr,"Modulo multiply test failed!\n");
B
Ben Laurie 已提交
774 775
		    return 0;
		    }
776 777 778 779 780 781 782 783 784
		}
	BN_free(a);
	BN_free(b);
	BN_free(c);
	BN_free(d);
	BN_free(e);
	return(1);
	}

U
Ulf Möller 已提交
785
int test_mod_exp(BIO *bp, BN_CTX *ctx)
786 787 788 789 790 791 792 793 794 795 796
	{
	BIGNUM *a,*b,*c,*d,*e;
	int i;

	a=BN_new();
	b=BN_new();
	c=BN_new();
	d=BN_new();
	e=BN_new();

	BN_rand(c,30,0,1); /* must be odd for montgomery */
797
	for (i=0; i<num2; i++)
798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818
		{
		BN_rand(a,20+i*5,0,0); /**/
		BN_rand(b,2+i,0,0); /**/

		if (!BN_mod_exp(d,a,b,c,ctx))
			return(00);

		if (bp != NULL)
			{
			if (!results)
				{
				BN_print(bp,a);
				BIO_puts(bp," ^ ");
				BN_print(bp,b);
				BIO_puts(bp," % ");
				BN_print(bp,c);
				BIO_puts(bp," - ");
				}
			BN_print(bp,d);
			BIO_puts(bp,"\n");
			}
B
Ben Laurie 已提交
819 820 821 822 823
		BN_exp(e,a,b,ctx);
		BN_sub(e,e,d);
		BN_div(a,b,e,c,ctx);
		if(!BN_is_zero(b))
		    {
824
		    fprintf(stderr,"Modulo exponentiation test failed!\n");
B
Ben Laurie 已提交
825 826
		    return 0;
		    }
827 828 829 830 831 832 833 834 835
		}
	BN_free(a);
	BN_free(b);
	BN_free(c);
	BN_free(d);
	BN_free(e);
	return(1);
	}

U
Ulf Möller 已提交
836
int test_exp(BIO *bp, BN_CTX *ctx)
837
	{
B
Ben Laurie 已提交
838
	BIGNUM *a,*b,*d,*e,*one;
839 840 841 842 843 844
	int i;

	a=BN_new();
	b=BN_new();
	d=BN_new();
	e=BN_new();
B
Ben Laurie 已提交
845 846
	one=BN_new();
	BN_one(one);
847

848
	for (i=0; i<num2; i++)
849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867
		{
		BN_rand(a,20+i*5,0,0); /**/
		BN_rand(b,2+i,0,0); /**/

		if (!BN_exp(d,a,b,ctx))
			return(00);

		if (bp != NULL)
			{
			if (!results)
				{
				BN_print(bp,a);
				BIO_puts(bp," ^ ");
				BN_print(bp,b);
				BIO_puts(bp," - ");
				}
			BN_print(bp,d);
			BIO_puts(bp,"\n");
			}
B
Ben Laurie 已提交
868 869 870 871 872 873
		BN_one(e);
		for( ; !BN_is_zero(b) ; BN_sub(b,b,one))
		    BN_mul(e,e,a,ctx);
		BN_sub(e,e,d);
		if(!BN_is_zero(e))
		    {
874
		    fprintf(stderr,"Exponentiation test failed!\n");
B
Ben Laurie 已提交
875 876
		    return 0;
		    }
877 878 879 880 881
		}
	BN_free(a);
	BN_free(b);
	BN_free(d);
	BN_free(e);
B
Ben Laurie 已提交
882
	BN_free(one);
883 884 885
	return(1);
	}

B
Ben Laurie 已提交
886
int test_lshift(BIO *bp,BN_CTX *ctx,BIGNUM *a_)
887
	{
B
Ben Laurie 已提交
888
	BIGNUM *a,*b,*c,*d;
889 890 891 892
	int i;

	b=BN_new();
	c=BN_new();
B
Ben Laurie 已提交
893
	d=BN_new();
894 895
	BN_one(c);

B
Ben Laurie 已提交
896 897 898 899 900 901 902 903
	if(a_)
	    a=a_;
	else
	    {
	    a=BN_new();
	    BN_rand(a,200,0,0); /**/
	    a->neg=rand_neg();
	    }
904
	for (i=0; i<num0; i++)
905 906 907 908 909 910 911 912 913 914 915 916 917 918 919
		{
		BN_lshift(b,a,i+1);
		BN_add(c,c,c);
		if (bp != NULL)
			{
			if (!results)
				{
				BN_print(bp,a);
				BIO_puts(bp," * ");
				BN_print(bp,c);
				BIO_puts(bp," - ");
				}
			BN_print(bp,b);
			BIO_puts(bp,"\n");
			}
B
Ben Laurie 已提交
920 921 922 923
		BN_mul(d,a,c,ctx);
		BN_sub(d,d,b);
		if(!BN_is_zero(d))
		    {
924 925 926 927 928 929 930 931 932 933
		    fprintf(stderr,"Left shift test failed!\n");
		    fprintf(stderr,"a=");
		    BN_print_fp(stderr,a);
		    fprintf(stderr,"\nb=");
		    BN_print_fp(stderr,b);
		    fprintf(stderr,"\nc=");
		    BN_print_fp(stderr,c);
		    fprintf(stderr,"\nd=");
		    BN_print_fp(stderr,d);
		    fprintf(stderr,"\n");
B
Ben Laurie 已提交
934 935
		    return 0;
		    }
936 937 938 939
		}
	BN_free(a);
	BN_free(b);
	BN_free(c);
B
Ben Laurie 已提交
940
	BN_free(d);
941 942 943
	return(1);
	}

U
Ulf Möller 已提交
944
int test_lshift1(BIO *bp)
945
	{
B
Ben Laurie 已提交
946
	BIGNUM *a,*b,*c;
947 948 949 950
	int i;

	a=BN_new();
	b=BN_new();
B
Ben Laurie 已提交
951
	c=BN_new();
952 953 954

	BN_rand(a,200,0,0); /**/
	a->neg=rand_neg();
955
	for (i=0; i<num0; i++)
956 957 958 959 960 961 962 963 964 965 966 967 968
		{
		BN_lshift1(b,a);
		if (bp != NULL)
			{
			if (!results)
				{
				BN_print(bp,a);
				BIO_puts(bp," * 2");
				BIO_puts(bp," - ");
				}
			BN_print(bp,b);
			BIO_puts(bp,"\n");
			}
B
Ben Laurie 已提交
969 970 971 972
		BN_add(c,a,a);
		BN_sub(a,b,c);
		if(!BN_is_zero(a))
		    {
973
		    fprintf(stderr,"Left shift one test failed!\n");
B
Ben Laurie 已提交
974 975 976
		    return 0;
		    }
		
977 978 979 980
		BN_copy(a,b);
		}
	BN_free(a);
	BN_free(b);
B
Ben Laurie 已提交
981
	BN_free(c);
982 983 984
	return(1);
	}

B
Ben Laurie 已提交
985
int test_rshift(BIO *bp,BN_CTX *ctx)
986
	{
B
Ben Laurie 已提交
987
	BIGNUM *a,*b,*c,*d,*e;
988 989 990 991 992
	int i;

	a=BN_new();
	b=BN_new();
	c=BN_new();
B
Ben Laurie 已提交
993 994
	d=BN_new();
	e=BN_new();
995 996 997 998
	BN_one(c);

	BN_rand(a,200,0,0); /**/
	a->neg=rand_neg();
999
	for (i=0; i<num0; i++)
1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014
		{
		BN_rshift(b,a,i+1);
		BN_add(c,c,c);
		if (bp != NULL)
			{
			if (!results)
				{
				BN_print(bp,a);
				BIO_puts(bp," / ");
				BN_print(bp,c);
				BIO_puts(bp," - ");
				}
			BN_print(bp,b);
			BIO_puts(bp,"\n");
			}
B
Ben Laurie 已提交
1015 1016 1017 1018
		BN_div(d,e,a,c,ctx);
		BN_sub(d,d,b);
		if(!BN_is_zero(d))
		    {
1019
		    fprintf(stderr,"Right shift test failed!\n");
B
Ben Laurie 已提交
1020 1021
		    return 0;
		    }
1022 1023 1024 1025
		}
	BN_free(a);
	BN_free(b);
	BN_free(c);
B
Ben Laurie 已提交
1026 1027
	BN_free(d);
	BN_free(e);
1028 1029 1030
	return(1);
	}

U
Ulf Möller 已提交
1031
int test_rshift1(BIO *bp)
1032
	{
B
Ben Laurie 已提交
1033
	BIGNUM *a,*b,*c;
1034 1035 1036 1037
	int i;

	a=BN_new();
	b=BN_new();
B
Ben Laurie 已提交
1038
	c=BN_new();
1039 1040 1041

	BN_rand(a,200,0,0); /**/
	a->neg=rand_neg();
1042
	for (i=0; i<num0; i++)
1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055
		{
		BN_rshift1(b,a);
		if (bp != NULL)
			{
			if (!results)
				{
				BN_print(bp,a);
				BIO_puts(bp," / 2");
				BIO_puts(bp," - ");
				}
			BN_print(bp,b);
			BIO_puts(bp,"\n");
			}
B
Ben Laurie 已提交
1056 1057 1058 1059
		BN_sub(c,a,b);
		BN_sub(c,c,b);
		if(!BN_is_zero(c) && !BN_is_one(c))
		    {
1060
		    fprintf(stderr,"Right shift one test failed!\n");
B
Ben Laurie 已提交
1061 1062
		    return 0;
		    }
1063 1064 1065 1066
		BN_copy(a,b);
		}
	BN_free(a);
	BN_free(b);
B
Ben Laurie 已提交
1067
	BN_free(c);
1068 1069 1070
	return(1);
	}

U
Ulf Möller 已提交
1071
int rand_neg(void)
1072 1073 1074 1075 1076 1077
	{
	static unsigned int neg=0;
	static int sign[8]={0,0,0,1,1,0,1,1};

	return(sign[(neg++)%8]);
	}