bntest.c 19.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
#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
int test_add(BIO *bp);
int test_sub(BIO *bp);
int test_lshift1(BIO *bp);
B
Ben Laurie 已提交
78
int test_lshift(BIO *bp,BN_CTX *ctx,BIGNUM *a_);
79
int test_rshift1(BIO *bp);
B
Ben Laurie 已提交
80
int test_rshift(BIO *bp,BN_CTX *ctx);
81 82 83 84 85 86 87 88
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);
89
int test_exp(BIO *bp,BN_CTX *ctx);
90 91 92
int rand_neg(void);
static int results=0;

93
#ifdef NO_STDIO
94
#define APPS_WIN16
95
#include "bss_file.c"
96 97
#endif

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

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

U
Ulf Möller 已提交
103
int main(int argc, char *argv[])
104 105 106 107 108
	{
	BN_CTX *ctx;
	BIO *out;
	char *outfile=NULL;

109 110
	results = 0;

111 112 113 114
	RAND_seed(rnd_seed, sizeof rnd_seed); /* or BN_rand may fail, and we don't
	                                       * even check its return value
	                                       * (which we should) */

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 154 155 156 157 158 159 160 161 162 163
	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);

B
Ben Laurie 已提交
164
	fprintf(stderr,"test BN_lshift (fixed)\n");
165
	if (!test_lshift(out,ctx,BN_bin2bn(lst,sizeof(lst)-1,NULL)))
B
Ben Laurie 已提交
166 167 168
	    goto err;
	fflush(stdout);

169
	fprintf(stderr,"test BN_lshift\n");
B
Ben Laurie 已提交
170
	if (!test_lshift(out,ctx,NULL)) goto err;
171 172 173 174 175 176 177
	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 已提交
178
	if (!test_rshift(out,ctx)) goto err;
179 180
	fflush(stdout);

181 182
	fprintf(stderr,"test BN_sqr\n");
	if (!test_sqr(out,ctx)) goto err;
183 184 185 186 187 188
	fflush(stdout);

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

189 190 191 192
	fprintf(stderr,"test BN_div\n");
	if (!test_div(out,ctx)) goto err;
	fflush(stdout);

193 194 195 196
	fprintf(stderr,"test BN_div_recp\n");
	if (!test_div_recp(out,ctx)) goto err;
	fflush(stdout);

197 198
	fprintf(stderr,"test BN_mod\n");
	if (!test_mod(out,ctx)) goto err;
199 200 201 202 203 204 205 206 207
	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);
B
Bodo Möller 已提交
208

209 210 211 212
	fprintf(stderr,"test BN_mod_exp\n");
	if (!test_mod_exp(out,ctx)) goto err;
	fflush(stdout);

213 214 215 216
	fprintf(stderr,"test BN_exp\n");
	if (!test_exp(out,ctx)) goto err;
	fflush(stdout);

217 218 219
	BN_CTX_free(ctx);
	BIO_free(out);

220 221 222
/**/
	exit(0);
err:
223
	BIO_puts(out,"1\n"); /* make sure bc fails if we are piping to it */
224 225 226 227 228 229
	ERR_load_crypto_strings();
	ERR_print_errors(out);
	exit(1);
	return(1);
	}

U
Ulf Möller 已提交
230
int test_add(BIO *bp)
231
	{
232
	BIGNUM a,b,c;
233 234 235
	int i;
	int j;

236 237 238
	BN_init(&a);
	BN_init(&b);
	BN_init(&c);
239

240
	BN_rand(&a,512,0,0);
241 242
	for (i=0; i<100; i++)
		{
243 244 245
		BN_rand(&b,450+i,0,0);
		a.neg=rand_neg();
		b.neg=rand_neg();
246 247
		if (bp == NULL)
			for (j=0; j<10000; j++)
248 249
				BN_add(&c,&a,&b);
		BN_add(&c,&a,&b);
250 251 252 253
		if (bp != NULL)
			{
			if (!results)
				{
254
				BN_print(bp,&a);
255
				BIO_puts(bp," + ");
256
				BN_print(bp,&b);
257 258
				BIO_puts(bp," - ");
				}
259
			BN_print(bp,&c);
260 261
			BIO_puts(bp,"\n");
			}
B
Ben Laurie 已提交
262 263 264 265 266 267 268 269 270
		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;
		    }
271
		}
272 273 274
	BN_free(&a);
	BN_free(&b);
	BN_free(&c);
275 276 277
	return(1);
	}

U
Ulf Möller 已提交
278
int test_sub(BIO *bp)
279
	{
280
	BIGNUM a,b,c;
281 282 283
	int i;
	int j;

284 285 286
	BN_init(&a);
	BN_init(&b);
	BN_init(&c);
287

288
	BN_rand(&a,512,0,0);
289 290
	for (i=0; i<100; i++)
		{
291 292 293
		BN_rand(&b,400+i,0,0);
		a.neg=rand_neg();
		b.neg=rand_neg();
294 295
		if (bp == NULL)
			for (j=0; j<10000; j++)
296 297
				BN_sub(&c,&a,&b);
		BN_sub(&c,&a,&b);
298 299 300 301
		if (bp != NULL)
			{
			if (!results)
				{
302
				BN_print(bp,&a);
303
				BIO_puts(bp," - ");
304
				BN_print(bp,&b);
305 306
				BIO_puts(bp," - ");
				}
307
			BN_print(bp,&c);
308 309
			BIO_puts(bp,"\n");
			}
B
Ben Laurie 已提交
310 311 312 313 314 315 316
		BN_add(&c,&c,&b);
		BN_sub(&c,&c,&a);
		if(!BN_is_zero(&c))
		    {
		    BIO_puts(bp,"Subtract test failed!\n");
		    return 0;
		    }
317
		}
318 319 320
	BN_free(&a);
	BN_free(&b);
	BN_free(&c);
321 322 323
	return(1);
	}

U
Ulf Möller 已提交
324
int test_div(BIO *bp, BN_CTX *ctx)
325
	{
B
Ben Laurie 已提交
326
	BIGNUM a,b,c,d,e;
327 328 329
	int i;
	int j;

330 331 332 333
	BN_init(&a);
	BN_init(&b);
	BN_init(&c);
	BN_init(&d);
B
Ben Laurie 已提交
334
	BN_init(&e);
335

336
	BN_rand(&a,400,0,0);
337 338
	for (i=0; i<100; i++)
		{
339 340 341
		BN_rand(&b,50+i,0,0);
		a.neg=rand_neg();
		b.neg=rand_neg();
342 343
		if (bp == NULL)
			for (j=0; j<100; j++)
344 345
				BN_div(&d,&c,&a,&b,ctx);
		BN_div(&d,&c,&a,&b,ctx);
346 347 348 349
		if (bp != NULL)
			{
			if (!results)
				{
350
				BN_print(bp,&a);
351
				BIO_puts(bp," / ");
352
				BN_print(bp,&b);
353 354
				BIO_puts(bp," - ");
				}
355
			BN_print(bp,&d);
356 357 358 359
			BIO_puts(bp,"\n");

			if (!results)
				{
360
				BN_print(bp,&a);
361
				BIO_puts(bp," % ");
362
				BN_print(bp,&b);
363 364
				BIO_puts(bp," - ");
				}
365
			BN_print(bp,&c);
366 367
			BIO_puts(bp,"\n");
			}
B
Ben Laurie 已提交
368 369 370 371 372 373 374 375
		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;
		    }
376
		}
377 378 379 380
	BN_free(&a);
	BN_free(&b);
	BN_free(&c);
	BN_free(&d);
B
Ben Laurie 已提交
381
	BN_free(&e);
382 383 384
	return(1);
	}

U
Ulf Möller 已提交
385
int test_div_recp(BIO *bp, BN_CTX *ctx)
386
	{
B
Ben Laurie 已提交
387
	BIGNUM a,b,c,d,e;
388 389 390 391 392 393 394 395 396
	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 已提交
397
	BN_init(&e);
398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431

	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 已提交
432 433 434 435 436 437 438 439
		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;
		    }
440 441 442 443 444
		}
	BN_free(&a);
	BN_free(&b);
	BN_free(&c);
	BN_free(&d);
B
Ben Laurie 已提交
445
	BN_free(&e);
446
	BN_RECP_CTX_free(&recp);
447 448 449
	return(1);
	}

U
Ulf Möller 已提交
450
int test_mul(BIO *bp)
451
	{
B
Ben Laurie 已提交
452
	BIGNUM a,b,c,d,e;
453 454
	int i;
	int j;
455
	BN_CTX ctx;
456

457 458 459 460
	BN_CTX_init(&ctx);
	BN_init(&a);
	BN_init(&b);
	BN_init(&c);
B
Ben Laurie 已提交
461 462
	BN_init(&d);
	BN_init(&e);
463

464
	BN_rand(&a,200,0,0);
465 466
	for (i=0; i<100; i++)
		{
467 468 469 470
		BN_rand(&b,250+i,0,0);
		BN_rand(&b,200,0,0);
		a.neg=rand_neg();
		b.neg=rand_neg();
471 472
		if (bp == NULL)
			for (j=0; j<100; j++)
473 474
				BN_mul(&c,&a,&b,&ctx);
		BN_mul(&c,&a,&b,&ctx);
475 476 477 478
		if (bp != NULL)
			{
			if (!results)
				{
479
				BN_print(bp,&a);
480
				BIO_puts(bp," * ");
481
				BN_print(bp,&b);
482 483
				BIO_puts(bp," - ");
				}
484
			BN_print(bp,&c);
485 486
			BIO_puts(bp,"\n");
			}
B
Ben Laurie 已提交
487 488 489 490 491 492 493
		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;
		    }
494
		}
495 496 497
	BN_free(&a);
	BN_free(&b);
	BN_free(&c);
B
Ben Laurie 已提交
498 499
	BN_free(&d);
	BN_free(&e);
500
	BN_CTX_free(&ctx);
501 502 503
	return(1);
	}

U
Ulf Möller 已提交
504
int test_sqr(BIO *bp, BN_CTX *ctx)
505
	{
B
Ben Laurie 已提交
506
	BIGNUM a,c,d,e;
507 508 509
	int i;
	int j;

510 511
	BN_init(&a);
	BN_init(&c);
B
Ben Laurie 已提交
512 513
	BN_init(&d);
	BN_init(&e);
514 515 516

	for (i=0; i<40; i++)
		{
517 518
		BN_rand(&a,40+i*10,0,0);
		a.neg=rand_neg();
519 520
		if (bp == NULL)
			for (j=0; j<100; j++)
521 522
				BN_sqr(&c,&a,ctx);
		BN_sqr(&c,&a,ctx);
523 524 525 526
		if (bp != NULL)
			{
			if (!results)
				{
527
				BN_print(bp,&a);
528
				BIO_puts(bp," * ");
529
				BN_print(bp,&a);
530 531
				BIO_puts(bp," - ");
				}
532
			BN_print(bp,&c);
533 534
			BIO_puts(bp,"\n");
			}
B
Ben Laurie 已提交
535 536 537 538 539 540 541
		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;
		    }
542
		}
543 544
	BN_free(&a);
	BN_free(&c);
B
Ben Laurie 已提交
545 546
	BN_free(&d);
	BN_free(&e);
547 548 549
	return(1);
	}

U
Ulf Möller 已提交
550
int test_mont(BIO *bp, BN_CTX *ctx)
551
	{
B
Ben Laurie 已提交
552
	BIGNUM a,b,c,d,A,B;
553
	BIGNUM n;
554 555 556 557
	int i;
	int j;
	BN_MONT_CTX *mont;

558 559 560
	BN_init(&a);
	BN_init(&b);
	BN_init(&c);
B
Ben Laurie 已提交
561
	BN_init(&d);
562 563 564
	BN_init(&A);
	BN_init(&B);
	BN_init(&n);
565 566 567

	mont=BN_MONT_CTX_new();

568 569
	BN_rand(&a,100,0,0); /**/
	BN_rand(&b,100,0,0); /**/
570 571
	for (i=0; i<10; i++)
		{
B
Bodo Möller 已提交
572 573 574 575 576
		int bits = (100%BN_BITS2+1)*BN_BITS2*i*BN_BITS2;

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

579 580
		BN_to_montgomery(&A,&a,mont,ctx);
		BN_to_montgomery(&B,&b,mont,ctx);
581 582 583

		if (bp == NULL)
			for (j=0; j<100; j++)
584 585 586
				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);/**/
587 588 589 590 591 592
		if (bp != NULL)
			{
			if (!results)
				{
#ifdef undef
fprintf(stderr,"%d * %d %% %d\n",
593 594
BN_num_bits(&a),
BN_num_bits(&b),
595 596
BN_num_bits(mont->N));
#endif
597
				BN_print(bp,&a);
598
				BIO_puts(bp," * ");
599
				BN_print(bp,&b);
600
				BIO_puts(bp," % ");
601
				BN_print(bp,&(mont->N));
602 603
				BIO_puts(bp," - ");
				}
604
			BN_print(bp,&A);
605 606
			BIO_puts(bp,"\n");
			}
B
Ben Laurie 已提交
607 608 609 610 611 612 613
		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;
		    }
614 615
		}
	BN_MONT_CTX_free(mont);
616 617 618
	BN_free(&a);
	BN_free(&b);
	BN_free(&c);
B
Ben Laurie 已提交
619 620 621 622
	BN_free(&d);
	BN_free(&A);
	BN_free(&B);
	BN_free(&n);
623 624 625
	return(1);
	}

U
Ulf Möller 已提交
626
int test_mod(BIO *bp, BN_CTX *ctx)
627
	{
B
Ben Laurie 已提交
628
	BIGNUM *a,*b,*c,*d,*e;
629 630 631 632 633 634
	int i;
	int j;

	a=BN_new();
	b=BN_new();
	c=BN_new();
B
Ben Laurie 已提交
635 636
	d=BN_new();
	e=BN_new();
637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659

	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 已提交
660 661 662 663 664 665 666
		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;
		    }
667 668 669 670
		}
	BN_free(a);
	BN_free(b);
	BN_free(c);
B
Ben Laurie 已提交
671 672
	BN_free(d);
	BN_free(e);
673 674 675
	return(1);
	}

U
Ulf Möller 已提交
676
int test_mod_mul(BIO *bp, BN_CTX *ctx)
677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720
	{
	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 已提交
721 722 723 724 725 726 727 728
		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;
		    }
729 730 731 732 733 734 735 736 737
		}
	BN_free(a);
	BN_free(b);
	BN_free(c);
	BN_free(d);
	BN_free(e);
	return(1);
	}

U
Ulf Möller 已提交
738
int test_mod_exp(BIO *bp, BN_CTX *ctx)
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 768 769 770 771
	{
	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 已提交
772 773 774 775 776 777 778 779
		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;
		    }
780 781 782 783 784 785 786 787 788
		}
	BN_free(a);
	BN_free(b);
	BN_free(c);
	BN_free(d);
	BN_free(e);
	return(1);
	}

U
Ulf Möller 已提交
789
int test_exp(BIO *bp, BN_CTX *ctx)
790
	{
B
Ben Laurie 已提交
791
	BIGNUM *a,*b,*d,*e,*one;
792 793 794 795 796 797
	int i;

	a=BN_new();
	b=BN_new();
	d=BN_new();
	e=BN_new();
B
Ben Laurie 已提交
798 799
	one=BN_new();
	BN_one(one);
800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820

	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 已提交
821 822 823 824 825 826 827 828 829
		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;
		    }
830 831 832 833 834
		}
	BN_free(a);
	BN_free(b);
	BN_free(d);
	BN_free(e);
B
Ben Laurie 已提交
835
	BN_free(one);
836 837 838
	return(1);
	}

B
Ben Laurie 已提交
839
int test_lshift(BIO *bp,BN_CTX *ctx,BIGNUM *a_)
840
	{
B
Ben Laurie 已提交
841
	BIGNUM *a,*b,*c,*d;
842 843 844 845
	int i;

	b=BN_new();
	c=BN_new();
B
Ben Laurie 已提交
846
	d=BN_new();
847 848
	BN_one(c);

B
Ben Laurie 已提交
849 850 851 852 853 854 855 856
	if(a_)
	    a=a_;
	else
	    {
	    a=BN_new();
	    BN_rand(a,200,0,0); /**/
	    a->neg=rand_neg();
	    }
857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872
	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 已提交
873 874 875 876 877
		BN_mul(d,a,c,ctx);
		BN_sub(d,d,b);
		if(!BN_is_zero(d))
		    {
		    BIO_puts(bp,"Left shift test failed!\n");
B
Ben Laurie 已提交
878 879 880 881 882 883 884 885 886
		    BIO_puts(bp,"a=");
		    BN_print(bp,a);
		    BIO_puts(bp,"\nb=");
		    BN_print(bp,b);
		    BIO_puts(bp,"\nc=");
		    BN_print(bp,c);
		    BIO_puts(bp,"\nd=");
		    BN_print(bp,d);
		    BIO_puts(bp,"\n");
B
Ben Laurie 已提交
887 888
		    return 0;
		    }
889 890 891 892
		}
	BN_free(a);
	BN_free(b);
	BN_free(c);
B
Ben Laurie 已提交
893
	BN_free(d);
894 895 896
	return(1);
	}

U
Ulf Möller 已提交
897
int test_lshift1(BIO *bp)
898
	{
B
Ben Laurie 已提交
899
	BIGNUM *a,*b,*c;
900 901 902 903
	int i;

	a=BN_new();
	b=BN_new();
B
Ben Laurie 已提交
904
	c=BN_new();
905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921

	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 已提交
922 923 924 925 926 927 928 929
		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;
		    }
		
930 931 932 933
		BN_copy(a,b);
		}
	BN_free(a);
	BN_free(b);
B
Ben Laurie 已提交
934
	BN_free(c);
935 936 937
	return(1);
	}

B
Ben Laurie 已提交
938
int test_rshift(BIO *bp,BN_CTX *ctx)
939
	{
B
Ben Laurie 已提交
940
	BIGNUM *a,*b,*c,*d,*e;
941 942 943 944 945
	int i;

	a=BN_new();
	b=BN_new();
	c=BN_new();
B
Ben Laurie 已提交
946 947
	d=BN_new();
	e=BN_new();
948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967
	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 已提交
968 969 970 971 972 973 974
		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;
		    }
975 976 977 978
		}
	BN_free(a);
	BN_free(b);
	BN_free(c);
B
Ben Laurie 已提交
979 980
	BN_free(d);
	BN_free(e);
981 982 983
	return(1);
	}

U
Ulf Möller 已提交
984
int test_rshift1(BIO *bp)
985
	{
B
Ben Laurie 已提交
986
	BIGNUM *a,*b,*c;
987 988 989 990
	int i;

	a=BN_new();
	b=BN_new();
B
Ben Laurie 已提交
991
	c=BN_new();
992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008

	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 已提交
1009 1010 1011 1012 1013 1014 1015
		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;
		    }
1016 1017 1018 1019
		BN_copy(a,b);
		}
	BN_free(a);
	BN_free(b);
B
Ben Laurie 已提交
1020
	BN_free(c);
1021 1022 1023
	return(1);
	}

U
Ulf Möller 已提交
1024
int rand_neg(void)
1025 1026 1027 1028 1029 1030
	{
	static unsigned int neg=0;
	static int sign[8]={0,0,0,1,1,0,1,1};

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