bntest.c 18.1 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 64 65 66 67
#include <openssl/e_os.h>
#include <openssl/bio.h>
#include <openssl/bn.h>
#include <openssl/rand.h>
#include <openssl/x509.h>
#include <openssl/err.h>
68

69 70 71 72
#ifdef WINDOWS
#include "../bio/bss_file.c"
#endif

73 74 75
int test_add(BIO *bp);
int test_sub(BIO *bp);
int test_lshift1(BIO *bp);
B
Ben Laurie 已提交
76
int test_lshift(BIO *bp,BN_CTX *ctx);
77
int test_rshift1(BIO *bp);
B
Ben Laurie 已提交
78
int test_rshift(BIO *bp,BN_CTX *ctx);
79 80 81 82 83 84 85 86
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);
87
int test_exp(BIO *bp,BN_CTX *ctx);
88 89 90
int rand_neg(void);
static int results=0;

91
#ifdef NO_STDIO
92
#define APPS_WIN16
93
#include "bss_file.c"
94 95
#endif

U
Ulf Möller 已提交
96
int main(int argc, char *argv[])
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 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
	{
	BN_CTX *ctx;
	BIO *out;
	char *outfile=NULL;

	srand((unsigned int)time(NULL));

	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");

	fprintf(stderr,"test BN_add\n");
	if (!test_add(out)) goto err;
	fflush(stdout);

	fprintf(stderr,"test BN_sub\n");
	if (!test_sub(out)) goto err;
	fflush(stdout);

	fprintf(stderr,"test BN_lshift1\n");
	if (!test_lshift1(out)) goto err;
	fflush(stdout);

	fprintf(stderr,"test BN_lshift\n");
B
Ben Laurie 已提交
154
	if (!test_lshift(out,ctx)) goto err;
155 156 157 158 159 160 161
	fflush(stdout);

	fprintf(stderr,"test BN_rshift1\n");
	if (!test_rshift1(out)) goto err;
	fflush(stdout);

	fprintf(stderr,"test BN_rshift\n");
B
Ben Laurie 已提交
162
	if (!test_rshift(out,ctx)) goto err;
163 164
	fflush(stdout);

165 166
	fprintf(stderr,"test BN_sqr\n");
	if (!test_sqr(out,ctx)) goto err;
167 168 169 170 171 172
	fflush(stdout);

	fprintf(stderr,"test BN_mul\n");
	if (!test_mul(out)) goto err;
	fflush(stdout);

173 174 175 176
	fprintf(stderr,"test BN_div\n");
	if (!test_div(out,ctx)) goto err;
	fflush(stdout);

177 178 179 180
	fprintf(stderr,"test BN_div_recp\n");
	if (!test_div_recp(out,ctx)) goto err;
	fflush(stdout);

181 182
	fprintf(stderr,"test BN_mod\n");
	if (!test_mod(out,ctx)) goto err;
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
	fflush(stdout);

	fprintf(stderr,"test BN_mod_mul\n");
	if (!test_mod_mul(out,ctx)) goto err;
	fflush(stdout);

/*
	fprintf(stderr,"test BN_mont\n");
	if (!test_mont(out,ctx)) goto err;
	fflush(stdout);
*/
	fprintf(stderr,"test BN_mod_exp\n");
	if (!test_mod_exp(out,ctx)) goto err;
	fflush(stdout);

198 199 200 201
	fprintf(stderr,"test BN_exp\n");
	if (!test_exp(out,ctx)) goto err;
	fflush(stdout);

202 203 204 205 206 207 208 209 210
/**/
	exit(0);
err:
	ERR_load_crypto_strings();
	ERR_print_errors(out);
	exit(1);
	return(1);
	}

U
Ulf Möller 已提交
211
int test_add(BIO *bp)
212
	{
213
	BIGNUM a,b,c;
214 215 216
	int i;
	int j;

217 218 219
	BN_init(&a);
	BN_init(&b);
	BN_init(&c);
220

221
	BN_rand(&a,512,0,0);
222 223
	for (i=0; i<100; i++)
		{
224 225 226
		BN_rand(&b,450+i,0,0);
		a.neg=rand_neg();
		b.neg=rand_neg();
227 228
		if (bp == NULL)
			for (j=0; j<10000; j++)
229 230
				BN_add(&c,&a,&b);
		BN_add(&c,&a,&b);
231 232 233 234
		if (bp != NULL)
			{
			if (!results)
				{
235
				BN_print(bp,&a);
236
				BIO_puts(bp," + ");
237
				BN_print(bp,&b);
238 239
				BIO_puts(bp," - ");
				}
240
			BN_print(bp,&c);
241 242
			BIO_puts(bp,"\n");
			}
B
Ben Laurie 已提交
243 244 245 246 247 248 249 250 251
		a.neg=!a.neg;
		b.neg=!b.neg;
		BN_add(&c,&c,&b);
		BN_add(&c,&c,&a);
		if(!BN_is_zero(&c))
		    {
		    BIO_puts(bp,"Add test failed!\n");
		    return 0;
		    }
252
		}
253 254 255
	BN_free(&a);
	BN_free(&b);
	BN_free(&c);
256 257 258
	return(1);
	}

U
Ulf Möller 已提交
259
int test_sub(BIO *bp)
260
	{
261
	BIGNUM a,b,c;
262 263 264
	int i;
	int j;

265 266 267
	BN_init(&a);
	BN_init(&b);
	BN_init(&c);
268

269
	BN_rand(&a,512,0,0);
270 271
	for (i=0; i<100; i++)
		{
272 273 274
		BN_rand(&b,400+i,0,0);
		a.neg=rand_neg();
		b.neg=rand_neg();
275 276
		if (bp == NULL)
			for (j=0; j<10000; j++)
277 278
				BN_sub(&c,&a,&b);
		BN_sub(&c,&a,&b);
279 280 281 282
		if (bp != NULL)
			{
			if (!results)
				{
283
				BN_print(bp,&a);
284
				BIO_puts(bp," - ");
285
				BN_print(bp,&b);
286 287
				BIO_puts(bp," - ");
				}
288
			BN_print(bp,&c);
289 290
			BIO_puts(bp,"\n");
			}
B
Ben Laurie 已提交
291 292 293 294 295 296 297
		BN_add(&c,&c,&b);
		BN_sub(&c,&c,&a);
		if(!BN_is_zero(&c))
		    {
		    BIO_puts(bp,"Subtract test failed!\n");
		    return 0;
		    }
298
		}
299 300 301
	BN_free(&a);
	BN_free(&b);
	BN_free(&c);
302 303 304
	return(1);
	}

U
Ulf Möller 已提交
305
int test_div(BIO *bp, BN_CTX *ctx)
306
	{
B
Ben Laurie 已提交
307
	BIGNUM a,b,c,d,e;
308 309 310
	int i;
	int j;

311 312 313 314
	BN_init(&a);
	BN_init(&b);
	BN_init(&c);
	BN_init(&d);
B
Ben Laurie 已提交
315
	BN_init(&e);
316

317
	BN_rand(&a,400,0,0);
318 319
	for (i=0; i<100; i++)
		{
320 321 322
		BN_rand(&b,50+i,0,0);
		a.neg=rand_neg();
		b.neg=rand_neg();
323 324
		if (bp == NULL)
			for (j=0; j<100; j++)
325 326
				BN_div(&d,&c,&a,&b,ctx);
		BN_div(&d,&c,&a,&b,ctx);
327 328 329 330
		if (bp != NULL)
			{
			if (!results)
				{
331
				BN_print(bp,&a);
332
				BIO_puts(bp," / ");
333
				BN_print(bp,&b);
334 335
				BIO_puts(bp," - ");
				}
336
			BN_print(bp,&d);
337 338 339 340
			BIO_puts(bp,"\n");

			if (!results)
				{
341
				BN_print(bp,&a);
342
				BIO_puts(bp," % ");
343
				BN_print(bp,&b);
344 345
				BIO_puts(bp," - ");
				}
346
			BN_print(bp,&c);
347 348
			BIO_puts(bp,"\n");
			}
B
Ben Laurie 已提交
349 350 351 352 353 354 355 356
		BN_mul(&e,&d,&b,ctx);
		BN_add(&d,&e,&c);
		BN_sub(&d,&d,&a);
		if(!BN_is_zero(&d))
		    {
		    BIO_puts(bp,"Division test failed!\n");
		    return 0;
		    }
357
		}
358 359 360 361
	BN_free(&a);
	BN_free(&b);
	BN_free(&c);
	BN_free(&d);
B
Ben Laurie 已提交
362
	BN_free(&e);
363 364 365
	return(1);
	}

U
Ulf Möller 已提交
366
int test_div_recp(BIO *bp, BN_CTX *ctx)
367
	{
B
Ben Laurie 已提交
368
	BIGNUM a,b,c,d,e;
369 370 371 372 373 374 375 376 377
	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 已提交
378
	BN_init(&e);
379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412

	BN_rand(&a,400,0,0);
	for (i=0; i<100; i++)
		{
		BN_rand(&b,50+i,0,0);
		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 已提交
413 414 415 416 417 418 419 420
		BN_mul(&e,&d,&b,ctx);
		BN_add(&d,&e,&c);
		BN_sub(&d,&d,&a);
		if(!BN_is_zero(&d))
		    {
		    BIO_puts(bp,"Reciprocal division test failed!\n");
		    return 0;
		    }
421 422 423 424 425
		}
	BN_free(&a);
	BN_free(&b);
	BN_free(&c);
	BN_free(&d);
B
Ben Laurie 已提交
426
	BN_free(&e);
427
	BN_RECP_CTX_free(&recp);
428 429 430
	return(1);
	}

U
Ulf Möller 已提交
431
int test_mul(BIO *bp)
432
	{
B
Ben Laurie 已提交
433
	BIGNUM a,b,c,d,e;
434 435
	int i;
	int j;
436
	BN_CTX ctx;
437

438 439 440 441
	BN_CTX_init(&ctx);
	BN_init(&a);
	BN_init(&b);
	BN_init(&c);
B
Ben Laurie 已提交
442 443
	BN_init(&d);
	BN_init(&e);
444

445
	BN_rand(&a,200,0,0);
446 447
	for (i=0; i<100; i++)
		{
448 449 450 451
		BN_rand(&b,250+i,0,0);
		BN_rand(&b,200,0,0);
		a.neg=rand_neg();
		b.neg=rand_neg();
452 453
		if (bp == NULL)
			for (j=0; j<100; j++)
454 455
				BN_mul(&c,&a,&b,&ctx);
		BN_mul(&c,&a,&b,&ctx);
456 457 458 459
		if (bp != NULL)
			{
			if (!results)
				{
460
				BN_print(bp,&a);
461
				BIO_puts(bp," * ");
462
				BN_print(bp,&b);
463 464
				BIO_puts(bp," - ");
				}
465
			BN_print(bp,&c);
466 467
			BIO_puts(bp,"\n");
			}
B
Ben Laurie 已提交
468 469 470 471 472 473 474
		BN_div(&d,&e,&c,&a,&ctx);
		BN_sub(&d,&d,&b);
		if(!BN_is_zero(&d) || !BN_is_zero(&e))
		    {
		    BIO_puts(bp,"Multiplication test failed!\n");
		    return 0;
		    }
475
		}
476 477 478
	BN_free(&a);
	BN_free(&b);
	BN_free(&c);
B
Ben Laurie 已提交
479 480
	BN_free(&d);
	BN_free(&e);
481
	BN_CTX_free(&ctx);
482 483 484
	return(1);
	}

U
Ulf Möller 已提交
485
int test_sqr(BIO *bp, BN_CTX *ctx)
486
	{
B
Ben Laurie 已提交
487
	BIGNUM a,c,d,e;
488 489 490
	int i;
	int j;

491 492
	BN_init(&a);
	BN_init(&c);
B
Ben Laurie 已提交
493 494
	BN_init(&d);
	BN_init(&e);
495 496 497

	for (i=0; i<40; i++)
		{
498 499
		BN_rand(&a,40+i*10,0,0);
		a.neg=rand_neg();
500 501
		if (bp == NULL)
			for (j=0; j<100; j++)
502 503
				BN_sqr(&c,&a,ctx);
		BN_sqr(&c,&a,ctx);
504 505 506 507
		if (bp != NULL)
			{
			if (!results)
				{
508
				BN_print(bp,&a);
509
				BIO_puts(bp," * ");
510
				BN_print(bp,&a);
511 512
				BIO_puts(bp," - ");
				}
513
			BN_print(bp,&c);
514 515
			BIO_puts(bp,"\n");
			}
B
Ben Laurie 已提交
516 517 518 519 520 521 522
		BN_div(&d,&e,&c,&a,ctx);
		BN_sub(&d,&d,&a);
		if(!BN_is_zero(&d) || !BN_is_zero(&e))
		    {
		    BIO_puts(bp,"Square test failed!\n");
		    return 0;
		    }
523
		}
524 525
	BN_free(&a);
	BN_free(&c);
B
Ben Laurie 已提交
526 527
	BN_free(&d);
	BN_free(&e);
528 529 530
	return(1);
	}

U
Ulf Möller 已提交
531
int test_mont(BIO *bp, BN_CTX *ctx)
532
	{
B
Ben Laurie 已提交
533
	BIGNUM a,b,c,d,A,B;
534
	BIGNUM n;
535 536 537 538
	int i;
	int j;
	BN_MONT_CTX *mont;

539 540 541
	BN_init(&a);
	BN_init(&b);
	BN_init(&c);
B
Ben Laurie 已提交
542
	BN_init(&d);
543 544 545
	BN_init(&A);
	BN_init(&B);
	BN_init(&n);
546 547 548

	mont=BN_MONT_CTX_new();

549 550
	BN_rand(&a,100,0,0); /**/
	BN_rand(&b,100,0,0); /**/
551 552
	for (i=0; i<10; i++)
		{
553 554
		BN_rand(&n,(100%BN_BITS2+1)*BN_BITS2*i*BN_BITS2,0,1); /**/
		BN_MONT_CTX_set(mont,&n,ctx);
555

556 557
		BN_to_montgomery(&A,&a,mont,ctx);
		BN_to_montgomery(&B,&b,mont,ctx);
558 559 560

		if (bp == NULL)
			for (j=0; j<100; j++)
561 562 563
				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);/**/
564 565 566 567 568 569
		if (bp != NULL)
			{
			if (!results)
				{
#ifdef undef
fprintf(stderr,"%d * %d %% %d\n",
570 571
BN_num_bits(&a),
BN_num_bits(&b),
572 573
BN_num_bits(mont->N));
#endif
574
				BN_print(bp,&a);
575
				BIO_puts(bp," * ");
576
				BN_print(bp,&b);
577
				BIO_puts(bp," % ");
578
				BN_print(bp,&(mont->N));
579 580
				BIO_puts(bp," - ");
				}
581
			BN_print(bp,&A);
582 583
			BIO_puts(bp,"\n");
			}
B
Ben Laurie 已提交
584 585 586 587 588 589 590
		BN_mod_mul(&d,&a,&b,&n,ctx);
		BN_sub(&d,&d,&A);
		if(!BN_is_zero(&d))
		    {
		    BIO_puts(bp,"Montgomery multiplication test failed!\n");
		    return 0;
		    }
591 592
		}
	BN_MONT_CTX_free(mont);
593 594 595
	BN_free(&a);
	BN_free(&b);
	BN_free(&c);
B
Ben Laurie 已提交
596 597 598 599
	BN_free(&d);
	BN_free(&A);
	BN_free(&B);
	BN_free(&n);
600 601 602
	return(1);
	}

U
Ulf Möller 已提交
603
int test_mod(BIO *bp, BN_CTX *ctx)
604
	{
B
Ben Laurie 已提交
605
	BIGNUM *a,*b,*c,*d,*e;
606 607 608 609 610 611
	int i;
	int j;

	a=BN_new();
	b=BN_new();
	c=BN_new();
B
Ben Laurie 已提交
612 613
	d=BN_new();
	e=BN_new();
614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636

	BN_rand(a,1024,0,0); /**/
	for (i=0; i<20; i++)
		{
		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 已提交
637 638 639 640 641 642 643
		BN_div(d,e,a,b,ctx);
		BN_sub(e,e,c);
		if(!BN_is_zero(e))
		    {
		    BIO_puts(bp,"Modulo test failed!\n");
		    return 0;
		    }
644 645 646 647
		}
	BN_free(a);
	BN_free(b);
	BN_free(c);
B
Ben Laurie 已提交
648 649
	BN_free(d);
	BN_free(e);
650 651 652
	return(1);
	}

U
Ulf Möller 已提交
653
int test_mod_mul(BIO *bp, BN_CTX *ctx)
654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697
	{
	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); /**/
	for (i=0; i<10; i++)
		{
		BN_rand(a,475+i*10,0,0); /**/
		BN_rand(b,425+i*10,0,0); /**/
		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 已提交
698 699 700 701 702 703 704 705
		BN_mul(d,a,b,ctx);
		BN_sub(d,d,e);
		BN_div(a,b,d,c,ctx);
		if(!BN_is_zero(b))
		    {
		    BIO_puts(bp,"Modulo multiply test failed!\n");
		    return 0;
		    }
706 707 708 709 710 711 712 713 714
		}
	BN_free(a);
	BN_free(b);
	BN_free(c);
	BN_free(d);
	BN_free(e);
	return(1);
	}

U
Ulf Möller 已提交
715
int test_mod_exp(BIO *bp, BN_CTX *ctx)
716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748
	{
	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 */
	for (i=0; i<6; i++)
		{
		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 已提交
749 750 751 752 753 754 755 756
		BN_exp(e,a,b,ctx);
		BN_sub(e,e,d);
		BN_div(a,b,e,c,ctx);
		if(!BN_is_zero(b))
		    {
		    BIO_puts(bp,"Modulo exponentiation test failed!\n");
		    return 0;
		    }
757 758 759 760 761 762 763 764 765
		}
	BN_free(a);
	BN_free(b);
	BN_free(c);
	BN_free(d);
	BN_free(e);
	return(1);
	}

U
Ulf Möller 已提交
766
int test_exp(BIO *bp, BN_CTX *ctx)
767
	{
B
Ben Laurie 已提交
768
	BIGNUM *a,*b,*d,*e,*one;
769 770 771 772 773 774
	int i;

	a=BN_new();
	b=BN_new();
	d=BN_new();
	e=BN_new();
B
Ben Laurie 已提交
775 776
	one=BN_new();
	BN_one(one);
777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797

	for (i=0; i<6; i++)
		{
		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 已提交
798 799 800 801 802 803 804 805 806
		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))
		    {
		    BIO_puts(bp,"Exponentiation test failed!\n");
		    return 0;
		    }
807 808 809 810 811
		}
	BN_free(a);
	BN_free(b);
	BN_free(d);
	BN_free(e);
B
Ben Laurie 已提交
812
	BN_free(one);
813 814 815
	return(1);
	}

B
Ben Laurie 已提交
816
int test_lshift(BIO *bp,BN_CTX *ctx)
817
	{
B
Ben Laurie 已提交
818
	BIGNUM *a,*b,*c,*d;
819 820 821 822 823
	int i;

	a=BN_new();
	b=BN_new();
	c=BN_new();
B
Ben Laurie 已提交
824
	d=BN_new();
825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844
	BN_one(c);

	BN_rand(a,200,0,0); /**/
	a->neg=rand_neg();
	for (i=0; i<70; i++)
		{
		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 已提交
845 846 847 848 849 850 851
		BN_mul(d,a,c,ctx);
		BN_sub(d,d,b);
		if(!BN_is_zero(d))
		    {
		    BIO_puts(bp,"Left shift test failed!\n");
		    return 0;
		    }
852 853 854 855
		}
	BN_free(a);
	BN_free(b);
	BN_free(c);
B
Ben Laurie 已提交
856
	BN_free(d);
857 858 859
	return(1);
	}

U
Ulf Möller 已提交
860
int test_lshift1(BIO *bp)
861
	{
B
Ben Laurie 已提交
862
	BIGNUM *a,*b,*c;
863 864 865 866
	int i;

	a=BN_new();
	b=BN_new();
B
Ben Laurie 已提交
867
	c=BN_new();
868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884

	BN_rand(a,200,0,0); /**/
	a->neg=rand_neg();
	for (i=0; i<70; i++)
		{
		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 已提交
885 886 887 888 889 890 891 892
		BN_add(c,a,a);
		BN_sub(a,b,c);
		if(!BN_is_zero(a))
		    {
		    BIO_puts(bp,"Left shift one test failed!\n");
		    return 0;
		    }
		
893 894 895 896
		BN_copy(a,b);
		}
	BN_free(a);
	BN_free(b);
B
Ben Laurie 已提交
897
	BN_free(c);
898 899 900
	return(1);
	}

B
Ben Laurie 已提交
901
int test_rshift(BIO *bp,BN_CTX *ctx)
902
	{
B
Ben Laurie 已提交
903
	BIGNUM *a,*b,*c,*d,*e;
904 905 906 907 908
	int i;

	a=BN_new();
	b=BN_new();
	c=BN_new();
B
Ben Laurie 已提交
909 910
	d=BN_new();
	e=BN_new();
911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930
	BN_one(c);

	BN_rand(a,200,0,0); /**/
	a->neg=rand_neg();
	for (i=0; i<70; i++)
		{
		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 已提交
931 932 933 934 935 936 937
		BN_div(d,e,a,c,ctx);
		BN_sub(d,d,b);
		if(!BN_is_zero(d))
		    {
		    BIO_puts(bp,"Right shift test failed!\n");
		    return 0;
		    }
938 939 940 941
		}
	BN_free(a);
	BN_free(b);
	BN_free(c);
B
Ben Laurie 已提交
942 943
	BN_free(d);
	BN_free(e);
944 945 946
	return(1);
	}

U
Ulf Möller 已提交
947
int test_rshift1(BIO *bp)
948
	{
B
Ben Laurie 已提交
949
	BIGNUM *a,*b,*c;
950 951 952 953
	int i;

	a=BN_new();
	b=BN_new();
B
Ben Laurie 已提交
954
	c=BN_new();
955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971

	BN_rand(a,200,0,0); /**/
	a->neg=rand_neg();
	for (i=0; i<70; i++)
		{
		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 已提交
972 973 974 975 976 977 978
		BN_sub(c,a,b);
		BN_sub(c,c,b);
		if(!BN_is_zero(c) && !BN_is_one(c))
		    {
		    BIO_puts(bp,"Right shift one test failed!\n");
		    return 0;
		    }
979 980 981 982
		BN_copy(a,b);
		}
	BN_free(a);
	BN_free(b);
B
Ben Laurie 已提交
983
	BN_free(c);
984 985 986
	return(1);
	}

U
Ulf Möller 已提交
987
int rand_neg(void)
988 989 990 991 992 993
	{
	static unsigned int neg=0;
	static int sign[8]={0,0,0,1,1,0,1,1};

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