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

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

73
#ifndef NOPROTO
74 75 76 77 78 79 80 81 82 83 84 85 86 87
int test_add(BIO *bp);
int test_sub(BIO *bp);
int test_lshift1(BIO *bp);
int test_lshift(BIO *bp);
int test_rshift1(BIO *bp);
int test_rshift(BIO *bp);
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);
88
int test_exp(BIO *bp,BN_CTX *ctx);
89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
int rand_neg(void);
#else
int test_add ();
int test_sub ();
int test_lshift1 ();
int test_lshift ();
int test_rshift1 ();
int test_rshift ();
int test_div ();
int test_mul ();
int test_sqr ();
int test_mont ();
int test_mod ();
int test_mod_mul ();
int test_mod_exp ();
104
int test_exp ();
105 106 107 108 109
int rand_neg();
#endif

static int results=0;

110
#ifdef NO_STDIO
111
#define APPS_WIN16
112
#include "bss_file.c"
113 114
#endif

U
Ulf Möller 已提交
115
int main(int argc, char *argv[])
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 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
	{
	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");
	if (!test_lshift(out)) goto err;
	fflush(stdout);

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

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

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

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

192 193 194 195
	fprintf(stderr,"test BN_div\n");
	if (!test_div(out,ctx)) goto err;
	fflush(stdout);

196 197 198 199
	fprintf(stderr,"test BN_div_recp\n");
	if (!test_div_recp(out,ctx)) goto err;
	fflush(stdout);

200 201
	fprintf(stderr,"test BN_mod\n");
	if (!test_mod(out,ctx)) goto err;
202 203 204 205 206 207 208 209 210 211 212 213 214 215 216
	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);

217 218 219 220
	fprintf(stderr,"test BN_exp\n");
	if (!test_exp(out,ctx)) goto err;
	fflush(stdout);

221 222 223 224 225 226 227 228 229
/**/
	exit(0);
err:
	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 262
			BIO_puts(bp,"\n");
			}
		}
263 264 265
	BN_free(&a);
	BN_free(&b);
	BN_free(&c);
266 267 268
	return(1);
	}

U
Ulf Möller 已提交
269
int test_sub(BIO *bp)
270
	{
271
	BIGNUM a,b,c;
272 273 274
	int i;
	int j;

275 276 277
	BN_init(&a);
	BN_init(&b);
	BN_init(&c);
278

279
	BN_rand(&a,512,0,0);
280 281
	for (i=0; i<100; i++)
		{
282 283 284
		BN_rand(&b,400+i,0,0);
		a.neg=rand_neg();
		b.neg=rand_neg();
285 286
		if (bp == NULL)
			for (j=0; j<10000; j++)
287 288
				BN_sub(&c,&a,&b);
		BN_sub(&c,&a,&b);
289 290 291 292
		if (bp != NULL)
			{
			if (!results)
				{
293
				BN_print(bp,&a);
294
				BIO_puts(bp," - ");
295
				BN_print(bp,&b);
296 297
				BIO_puts(bp," - ");
				}
298
			BN_print(bp,&c);
299 300 301
			BIO_puts(bp,"\n");
			}
		}
302 303 304
	BN_free(&a);
	BN_free(&b);
	BN_free(&c);
305 306 307
	return(1);
	}

U
Ulf Möller 已提交
308
int test_div(BIO *bp, BN_CTX *ctx)
309
	{
310
	BIGNUM a,b,c,d;
311 312 313
	int i;
	int j;

314 315 316 317
	BN_init(&a);
	BN_init(&b);
	BN_init(&c);
	BN_init(&d);
318

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

			if (!results)
				{
343
				BN_print(bp,&a);
344
				BIO_puts(bp," % ");
345
				BN_print(bp,&b);
346 347
				BIO_puts(bp," - ");
				}
348
			BN_print(bp,&c);
349 350 351
			BIO_puts(bp,"\n");
			}
		}
352 353 354 355 356 357 358
	BN_free(&a);
	BN_free(&b);
	BN_free(&c);
	BN_free(&d);
	return(1);
	}

U
Ulf Möller 已提交
359
int test_div_recp(BIO *bp, BN_CTX *ctx)
360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 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
	{
	BIGNUM a,b,c,d;
	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);

	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");
			}
		}
	BN_free(&a);
	BN_free(&b);
	BN_free(&c);
	BN_free(&d);
	BN_RECP_CTX_free(&recp);
411 412 413
	return(1);
	}

U
Ulf Möller 已提交
414
int test_mul(BIO *bp)
415
	{
416
	BIGNUM a,b,c;
417 418
	int i;
	int j;
419
	BN_CTX ctx;
420

421 422 423 424
	BN_CTX_init(&ctx);
	BN_init(&a);
	BN_init(&b);
	BN_init(&c);
425

426
	BN_rand(&a,200,0,0);
427 428
	for (i=0; i<100; i++)
		{
429 430 431 432
		BN_rand(&b,250+i,0,0);
		BN_rand(&b,200,0,0);
		a.neg=rand_neg();
		b.neg=rand_neg();
433 434
		if (bp == NULL)
			for (j=0; j<100; j++)
435 436 437
				BN_mul(&c,&a,&b,&ctx);
		BN_mul(&c,&a,&b,&ctx);
/*bn_do(&c,&a,&b,ctx); */
438 439 440 441
		if (bp != NULL)
			{
			if (!results)
				{
442
				BN_print(bp,&a);
443
				BIO_puts(bp," * ");
444
				BN_print(bp,&b);
445 446
				BIO_puts(bp," - ");
				}
447
			BN_print(bp,&c);
448 449 450
			BIO_puts(bp,"\n");
			}
		}
451 452 453 454
	BN_free(&a);
	BN_free(&b);
	BN_free(&c);
	BN_CTX_free(&ctx);
455 456 457
	return(1);
	}

U
Ulf Möller 已提交
458
int test_sqr(BIO *bp, BN_CTX *ctx)
459
	{
460
	BIGNUM a,c;
461 462 463
	int i;
	int j;

464 465
	BN_init(&a);
	BN_init(&c);
466 467 468

	for (i=0; i<40; i++)
		{
469 470
		BN_rand(&a,40+i*10,0,0);
		a.neg=rand_neg();
471 472
		if (bp == NULL)
			for (j=0; j<100; j++)
473 474
				BN_sqr(&c,&a,ctx);
		BN_sqr(&c,&a,ctx);
475 476 477 478
		if (bp != NULL)
			{
			if (!results)
				{
479
				BN_print(bp,&a);
480
				BIO_puts(bp," * ");
481
				BN_print(bp,&a);
482 483
				BIO_puts(bp," - ");
				}
484
			BN_print(bp,&c);
485 486 487
			BIO_puts(bp,"\n");
			}
		}
488 489
	BN_free(&a);
	BN_free(&c);
490 491 492
	return(1);
	}

U
Ulf Möller 已提交
493
int test_mont(BIO *bp, BN_CTX *ctx)
494
	{
495 496
	BIGNUM a,b,c,A,B;
	BIGNUM n;
497 498 499 500
	int i;
	int j;
	BN_MONT_CTX *mont;

501 502 503 504 505 506
	BN_init(&a);
	BN_init(&b);
	BN_init(&c);
	BN_init(&A);
	BN_init(&B);
	BN_init(&n);
507 508 509

	mont=BN_MONT_CTX_new();

510 511
	BN_rand(&a,100,0,0); /**/
	BN_rand(&b,100,0,0); /**/
512 513
	for (i=0; i<10; i++)
		{
514 515
		BN_rand(&n,(100%BN_BITS2+1)*BN_BITS2*i*BN_BITS2,0,1); /**/
		BN_MONT_CTX_set(mont,&n,ctx);
516

517 518
		BN_to_montgomery(&A,&a,mont,ctx);
		BN_to_montgomery(&B,&b,mont,ctx);
519 520 521

		if (bp == NULL)
			for (j=0; j<100; j++)
522 523 524
				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);/**/
525 526 527 528 529 530
		if (bp != NULL)
			{
			if (!results)
				{
#ifdef undef
fprintf(stderr,"%d * %d %% %d\n",
531 532
BN_num_bits(&a),
BN_num_bits(&b),
533 534
BN_num_bits(mont->N));
#endif
535
				BN_print(bp,&a);
536
				BIO_puts(bp," * ");
537
				BN_print(bp,&b);
538
				BIO_puts(bp," % ");
539
				BN_print(bp,&(mont->N));
540 541
				BIO_puts(bp," - ");
				}
542
			BN_print(bp,&A);
543 544 545 546
			BIO_puts(bp,"\n");
			}
		}
	BN_MONT_CTX_free(mont);
547 548 549
	BN_free(&a);
	BN_free(&b);
	BN_free(&c);
550 551 552
	return(1);
	}

U
Ulf Möller 已提交
553
int test_mod(BIO *bp, BN_CTX *ctx)
554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591
	{
	BIGNUM *a,*b,*c;
	int i;
	int j;

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

	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");
			}
		}
	BN_free(a);
	BN_free(b);
	BN_free(c);
	return(1);
	}

U
Ulf Möller 已提交
592
int test_mod_mul(BIO *bp, BN_CTX *ctx)
593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645
	{
	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");
			}
		}
	BN_free(a);
	BN_free(b);
	BN_free(c);
	BN_free(d);
	BN_free(e);
	return(1);
	}

U
Ulf Möller 已提交
646
int test_mod_exp(BIO *bp, BN_CTX *ctx)
647 648 649 650 651 652 653 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
	{
	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");
			}
		}
	BN_free(a);
	BN_free(b);
	BN_free(c);
	BN_free(d);
	BN_free(e);
	return(1);
	}

U
Ulf Möller 已提交
689
int test_exp(BIO *bp, BN_CTX *ctx)
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 721 722 723 724 725 726
	{
	BIGNUM *a,*b,*d,*e;
	int i;

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

	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");
			}
		}
	BN_free(a);
	BN_free(b);
	BN_free(d);
	BN_free(e);
	return(1);
	}

U
Ulf Möller 已提交
727
int test_lshift(BIO *bp)
728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761
	{
	BIGNUM *a,*b,*c;
	int i;

	a=BN_new();
	b=BN_new();
	c=BN_new();
	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");
			}
		}
	BN_free(a);
	BN_free(b);
	BN_free(c);
	return(1);
	}

U
Ulf Möller 已提交
762
int test_lshift1(BIO *bp)
763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792
	{
	BIGNUM *a,*b;
	int i;

	a=BN_new();
	b=BN_new();

	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");
			}
		BN_copy(a,b);
		}
	BN_free(a);
	BN_free(b);
	return(1);
	}

U
Ulf Möller 已提交
793
int test_rshift(BIO *bp)
794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827
	{
	BIGNUM *a,*b,*c;
	int i;

	a=BN_new();
	b=BN_new();
	c=BN_new();
	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");
			}
		}
	BN_free(a);
	BN_free(b);
	BN_free(c);
	return(1);
	}

U
Ulf Möller 已提交
828
int test_rshift1(BIO *bp)
829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858
	{
	BIGNUM *a,*b;
	int i;

	a=BN_new();
	b=BN_new();

	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");
			}
		BN_copy(a,b);
		}
	BN_free(a);
	BN_free(b);
	return(1);
	}

U
Ulf Möller 已提交
859
int rand_neg(void)
860 861 862 863 864 865
	{
	static unsigned int neg=0;
	static int sign[8]={0,0,0,1,1,0,1,1};

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