1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/os/ossrv/ssl/tsrc/crypto_test/src/bntest.c Fri Jun 15 03:10:57 2012 +0200
1.3 @@ -0,0 +1,4502 @@
1.4 +/* crypto/bn/bntest.c */
1.5 +/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
1.6 + * All rights reserved.
1.7 + *
1.8 + * This package is an SSL implementation written
1.9 + * by Eric Young (eay@cryptsoft.com).
1.10 + * The implementation was written so as to conform with Netscapes SSL.
1.11 + *
1.12 + * This library is free for commercial and non-commercial use as long as
1.13 + * the following conditions are aheared to. The following conditions
1.14 + * apply to all code found in this distribution, be it the RC4, RSA,
1.15 + * lhash, DES, etc., code; not just the SSL code. The SSL documentation
1.16 + * included with this distribution is covered by the same copyright terms
1.17 + * except that the holder is Tim Hudson (tjh@cryptsoft.com).
1.18 + *
1.19 + * Copyright remains Eric Young's, and as such any Copyright notices in
1.20 + * the code are not to be removed.
1.21 + * If this package is used in a product, Eric Young should be given attribution
1.22 + * as the author of the parts of the library used.
1.23 + * This can be in the form of a textual message at program startup or
1.24 + * in documentation (online or textual) provided with the package.
1.25 + *
1.26 + * Redistribution and use in source and binary forms, with or without
1.27 + * modification, are permitted provided that the following conditions
1.28 + * are met:
1.29 + * 1. Redistributions of source code must retain the copyright
1.30 + * notice, this list of conditions and the following disclaimer.
1.31 + * 2. Redistributions in binary form must reproduce the above copyright
1.32 + * notice, this list of conditions and the following disclaimer in the
1.33 + * documentation and/or other materials provided with the distribution.
1.34 + * 3. All advertising materials mentioning features or use of this software
1.35 + * must display the following acknowledgement:
1.36 + * "This product includes cryptographic software written by
1.37 + * Eric Young (eay@cryptsoft.com)"
1.38 + * The word 'cryptographic' can be left out if the rouines from the library
1.39 + * being used are not cryptographic related :-).
1.40 + * 4. If you include any Windows specific code (or a derivative thereof) from
1.41 + * the apps directory (application code) you must include an acknowledgement:
1.42 + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
1.43 + *
1.44 + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
1.45 + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1.46 + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1.47 + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1.48 + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1.49 + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
1.50 + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
1.51 + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
1.52 + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
1.53 + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
1.54 + * SUCH DAMAGE.
1.55 + *
1.56 + * The licence and distribution terms for any publically available version or
1.57 + * derivative of this code cannot be changed. i.e. this code cannot simply be
1.58 + * copied and put under another distribution licence
1.59 + * [including the GNU Public Licence.]
1.60 + */
1.61 +/* ====================================================================
1.62 + * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
1.63 + *
1.64 + * Portions of the attached software ("Contribution") are developed by
1.65 + * SUN MICROSYSTEMS, INC., and are contributed to the OpenSSL project.
1.66 + *
1.67 + * The Contribution is licensed pursuant to the Eric Young open source
1.68 + * license provided above.
1.69 + *
1.70 + * The binary polynomial arithmetic software is originally written by
1.71 + * Sheueling Chang Shantz and Douglas Stebila of Sun Microsystems Laboratories.
1.72 + *
1.73 + */
1.74 + /*
1.75 + © Portions copyright (c) 2006 Nokia Corporation. All rights reserved.
1.76 + */
1.77 +
1.78 +/* Until the key-gen callbacks are modified to use newer prototypes, we allow
1.79 + * deprecated functions for openssl-internal code */
1.80 +#ifndef SYMBIAN
1.81 +#ifdef OPENSSL_NO_DEPRECATED
1.82 +#undef OPENSSL_NO_DEPRECATED
1.83 +#endif
1.84 +#endif
1.85 +
1.86 +#ifdef SYMBIAN
1.87 +#include <e32def.h>
1.88 +#endif
1.89 +
1.90 +
1.91 +#include <stdio.h>
1.92 +#include <stdlib.h>
1.93 +#include <string.h>
1.94 +#ifndef SYMBIAN
1.95 +#include "../e_os.h"
1.96 +#else
1.97 +#include "e_os.h"
1.98 +#endif
1.99 +
1.100 +#include <openssl/bio.h>
1.101 +#include <openssl/bn.h>
1.102 +#include <openssl/rand.h>
1.103 +#include <openssl/x509.h>
1.104 +#include <openssl/err.h>
1.105 +#ifdef SYMBIAN
1.106 +#ifdef stdin
1.107 +#undef stdin
1.108 +#endif
1.109 +#ifdef stdout
1.110 +#undef stdout
1.111 +#endif
1.112 +#ifdef stderr
1.113 +#undef stderr
1.114 +#endif
1.115 +#define stdin fp_stdin
1.116 +#define stdout fp_stdout
1.117 +#define stderr fp_stderr
1.118 +extern FILE *fp_stdout;
1.119 +extern FILE *fp_stderr;
1.120 +#endif
1.121 +
1.122 +const int num0 = 100; /* number of tests */
1.123 +const int num1 = 50; /* additional tests for some functions */
1.124 +const int num2 = 5; /* number of tests for slow functions */
1.125 +
1.126 +int test_add(BIO *bp);
1.127 +int test_sub(BIO *bp);
1.128 +int test_lshift1(BIO *bp);
1.129 +int test_lshift(BIO *bp,BN_CTX *ctx,BIGNUM *a_);
1.130 +int test_rshift1(BIO *bp);
1.131 +int test_rshift(BIO *bp,BN_CTX *ctx);
1.132 +int test_div(BIO *bp,BN_CTX *ctx);
1.133 +int test_div_word(BIO *bp);
1.134 +int test_div_recp(BIO *bp,BN_CTX *ctx);
1.135 +int test_mul(BIO *bp);
1.136 +int test_sqr(BIO *bp,BN_CTX *ctx);
1.137 +int test_mont(BIO *bp,BN_CTX *ctx);
1.138 +int test_mod(BIO *bp,BN_CTX *ctx);
1.139 +int test_mod_mul(BIO *bp,BN_CTX *ctx);
1.140 +int test_mod_exp(BIO *bp,BN_CTX *ctx);
1.141 +int test_mod_exp_mont_consttime(BIO *bp,BN_CTX *ctx);
1.142 +int test_exp(BIO *bp,BN_CTX *ctx);
1.143 +int test_gf2m_add(BIO *bp);
1.144 +int test_gf2m_mod(BIO *bp);
1.145 +int test_gf2m_mod_mul(BIO *bp,BN_CTX *ctx);
1.146 +int test_gf2m_mod_sqr(BIO *bp,BN_CTX *ctx);
1.147 +int test_gf2m_mod_inv(BIO *bp,BN_CTX *ctx);
1.148 +int test_gf2m_mod_div(BIO *bp,BN_CTX *ctx);
1.149 +int test_gf2m_mod_exp(BIO *bp,BN_CTX *ctx);
1.150 +int test_gf2m_mod_sqrt(BIO *bp,BN_CTX *ctx);
1.151 +int test_gf2m_mod_solve_quad(BIO *bp,BN_CTX *ctx);
1.152 +int test_kron(BIO *bp,BN_CTX *ctx);
1.153 +int test_sqrt(BIO *bp,BN_CTX *ctx);
1.154 +int rand_neg(void);
1.155 +static int results=0;
1.156 +
1.157 +static unsigned char lst[]="\xC6\x4F\x43\x04\x2A\xEA\xCA\x6E\x58\x36\x80\x5B\xE8\xC9"
1.158 +"\x9B\x04\x5D\x48\x36\xC2\xFD\x16\xC9\x64\xF0";
1.159 +
1.160 +static const char rnd_seed[] = "string to make the random number generator think it has entropy";
1.161 +
1.162 +static void message(BIO *out, char *m)
1.163 + {
1.164 + fprintf(stderr, "test %s\n", m);
1.165 + BIO_puts(out, "print \"test ");
1.166 + BIO_puts(out, m);
1.167 + BIO_puts(out, "\\n\"\n");
1.168 + }
1.169 +
1.170 +#ifndef SYMBIAN
1.171 +int main(int argc, char *argv[])
1.172 +#else
1.173 +int bn_main(int argc, char *argv[])
1.174 +#endif
1.175 +
1.176 + {
1.177 + BN_CTX *ctx;
1.178 + BIO *out;
1.179 + char *outfile=NULL;
1.180 +
1.181 + results = 0;
1.182 + RAND_seed(rnd_seed, sizeof rnd_seed); /* or BN_generate_prime may fail */
1.183 + if(errno==ENOMEM)
1.184 + {
1.185 + return 1;
1.186 + }
1.187 +#ifndef SYMBIAN
1.188 + argc--;
1.189 + argv++;
1.190 +#endif
1.191 + while (argc >= 1)
1.192 + {
1.193 + if (strcmp(*argv,"-results") == 0)
1.194 + results=1;
1.195 + else if (strcmp(*argv,"-out") == 0)
1.196 + {
1.197 + if (--argc < 1) break;
1.198 + outfile= *(++argv);
1.199 + }
1.200 + argc--;
1.201 + argv++;
1.202 + }
1.203 +
1.204 +
1.205 + ctx=BN_CTX_new();
1.206 + if(ctx == NULL&&errno==ENOMEM)
1.207 + {
1.208 + return 1;
1.209 + }
1.210 + if (ctx == NULL)
1.211 + return 1;
1.212 + out=BIO_new(BIO_s_file());
1.213 + if(out == NULL&&errno==ENOMEM)
1.214 + {
1.215 + return 1;
1.216 + }
1.217 +
1.218 + if (out == NULL)
1.219 + return 1;
1.220 + if (outfile == NULL)
1.221 + {
1.222 + BIO_set_fp(out,stdout,BIO_NOCLOSE);
1.223 + if(errno==ENOMEM)
1.224 + {
1.225 + return 1;
1.226 + }
1.227 + }
1.228 + else
1.229 + {
1.230 + if (!BIO_write_filename(out,outfile))
1.231 + {
1.232 + return 1;
1.233 + }
1.234 + }
1.235 +
1.236 + if (!results)
1.237 + BIO_puts(out,"obase=16\nibase=16\n");
1.238 + if(errno==ENOMEM)
1.239 + {
1.240 + return 1;
1.241 + }
1.242 + message(out,"BN_add");
1.243 + if (!test_add(out))
1.244 + {
1.245 + if(errno==ENOMEM)
1.246 + {
1.247 + return 1;
1.248 + }
1.249 + goto err;
1.250 + }
1.251 + (void)BIO_flush(out);
1.252 + if(errno==ENOMEM)
1.253 + {
1.254 + return 1;
1.255 + }
1.256 +
1.257 + message(out,"BN_sub");
1.258 + if (!test_sub(out))
1.259 + {
1.260 + if(errno==ENOMEM)
1.261 + {
1.262 + return 1;
1.263 + }
1.264 + goto err;
1.265 + }
1.266 + (void)BIO_flush(out);
1.267 + if(errno==ENOMEM)
1.268 + {
1.269 + return 1;
1.270 + }
1.271 +
1.272 + message(out,"BN_lshift1");
1.273 + if (!test_lshift1(out))
1.274 + {
1.275 + if(errno==ENOMEM)
1.276 + {
1.277 + return 1;
1.278 + }
1.279 + goto err;
1.280 + }
1.281 + (void)BIO_flush(out);
1.282 + if(errno==ENOMEM)
1.283 + {
1.284 + return 1;
1.285 + }
1.286 + message(out,"BN_lshift (fixed)");
1.287 + if (!test_lshift(out,ctx,BN_bin2bn(lst,sizeof(lst)-1,NULL)))
1.288 + {
1.289 + if(errno==ENOMEM)
1.290 + {
1.291 + return 1;
1.292 + }
1.293 + goto err;
1.294 + }
1.295 + (void)BIO_flush(out);
1.296 + if(errno==ENOMEM)
1.297 + {
1.298 + return 1;
1.299 + }
1.300 + message(out,"BN_lshift");
1.301 + if (!test_lshift(out,ctx,NULL))
1.302 + {
1.303 + if(errno==ENOMEM)
1.304 + {
1.305 + return 1;
1.306 + }
1.307 + goto err;
1.308 + }
1.309 + (void)BIO_flush(out);
1.310 + if(errno==ENOMEM)
1.311 + {
1.312 + return 1;
1.313 + }
1.314 + message(out,"BN_rshift1");
1.315 + if (!test_rshift1(out))
1.316 + {
1.317 + if(errno==ENOMEM)
1.318 + {
1.319 + return 1;
1.320 + }
1.321 + goto err;
1.322 + }
1.323 + (void)BIO_flush(out);
1.324 + if(errno==ENOMEM)
1.325 + {
1.326 + return 1;
1.327 + }
1.328 + message(out,"BN_rshift");
1.329 + if (!test_rshift(out,ctx))
1.330 + {
1.331 + if(errno==ENOMEM)
1.332 + {
1.333 + return 1;
1.334 + }
1.335 + goto err;
1.336 + }
1.337 + (void)BIO_flush(out);
1.338 + if(errno==ENOMEM)
1.339 + {
1.340 + return 1;
1.341 + }
1.342 + message(out,"BN_sqr");
1.343 + if (!test_sqr(out,ctx))
1.344 + {
1.345 + if(errno==ENOMEM)
1.346 + {
1.347 + return 1;
1.348 + }
1.349 + goto err;
1.350 + }
1.351 + (void)BIO_flush(out);
1.352 + if(errno==ENOMEM)
1.353 + {
1.354 + return 1;
1.355 + }
1.356 +
1.357 + message(out,"BN_mul");
1.358 + if (!test_mul(out))
1.359 + {
1.360 + if(errno==ENOMEM)
1.361 + {
1.362 + return 1;
1.363 + }
1.364 + goto err;
1.365 + }
1.366 + (void)BIO_flush(out);
1.367 + if(errno==ENOMEM)
1.368 + {
1.369 + return 1;
1.370 + }
1.371 + message(out,"BN_div");
1.372 + if (!test_div(out,ctx))
1.373 + {
1.374 + if(errno==ENOMEM)
1.375 + {
1.376 + return 1;
1.377 + }
1.378 + goto err;
1.379 + }
1.380 + (void)BIO_flush(out);
1.381 + if(errno==ENOMEM)
1.382 + {
1.383 + return 1;
1.384 + }
1.385 + message(out,"BN_div_word");
1.386 + if (!test_div_word(out))
1.387 + {
1.388 + if(errno==ENOMEM)
1.389 + {
1.390 + return 1;
1.391 + }
1.392 + goto err;
1.393 + }
1.394 + (void)BIO_flush(out);
1.395 + if(errno==ENOMEM)
1.396 + {
1.397 + return 1;
1.398 + }
1.399 + message(out,"BN_div_recp");
1.400 + if (!test_div_recp(out,ctx))
1.401 + {
1.402 + if(errno==ENOMEM)
1.403 + {
1.404 + return 1;
1.405 + }
1.406 + goto err;
1.407 + }
1.408 + (void)BIO_flush(out);
1.409 + if(errno==ENOMEM)
1.410 + {
1.411 + return 1;
1.412 + }
1.413 + message(out,"BN_mod");
1.414 + if (!test_mod(out,ctx))
1.415 + {
1.416 + if(errno==ENOMEM)
1.417 + {
1.418 + return 1;
1.419 + }
1.420 + goto err;
1.421 + }
1.422 + (void)BIO_flush(out);
1.423 + if(errno==ENOMEM)
1.424 + {
1.425 + return 1;
1.426 + }
1.427 + message(out,"BN_mod_mul");
1.428 + if (!test_mod_mul(out,ctx))
1.429 + {
1.430 + if(errno==ENOMEM)
1.431 + {
1.432 + return 1;
1.433 + }
1.434 + goto err;
1.435 + }
1.436 + (void)BIO_flush(out);
1.437 + if(errno==ENOMEM)
1.438 + {
1.439 + return 1;
1.440 + }
1.441 + message(out,"BN_mont");
1.442 + if (!test_mont(out,ctx))
1.443 + {
1.444 + if(errno==ENOMEM)
1.445 + {
1.446 + return 1;
1.447 + }
1.448 + goto err;
1.449 + }
1.450 + (void)BIO_flush(out);
1.451 + if(errno==ENOMEM)
1.452 + {
1.453 + return 1;
1.454 + }
1.455 + message(out,"BN_mod_exp");
1.456 + if (!test_mod_exp(out,ctx))
1.457 + {
1.458 + if(errno==ENOMEM)
1.459 + {
1.460 + return 1;
1.461 + }
1.462 + goto err;
1.463 + }
1.464 + (void)BIO_flush(out);
1.465 + if(errno==ENOMEM)
1.466 + {
1.467 + return 1;
1.468 + }
1.469 + message(out,"BN_mod_exp_mont_consttime");
1.470 + if (!test_mod_exp_mont_consttime(out,ctx))
1.471 + {
1.472 + if(errno==ENOMEM)
1.473 + {
1.474 + return 1;
1.475 + }
1.476 + goto err;
1.477 + }
1.478 + (void)BIO_flush(out);
1.479 + if(errno==ENOMEM)
1.480 + {
1.481 + return 1;
1.482 + }
1.483 + message(out,"BN_exp");
1.484 + if (!test_exp(out,ctx))
1.485 + {
1.486 + if(errno==ENOMEM)
1.487 + {
1.488 + return 1;
1.489 + }
1.490 + goto err;
1.491 + }
1.492 + (void)BIO_flush(out);
1.493 + if(errno==ENOMEM)
1.494 + {
1.495 + return 1;
1.496 + }
1.497 + message(out,"BN_kronecker");
1.498 + if (!test_kron(out,ctx))
1.499 + {
1.500 + if(errno==ENOMEM)
1.501 + {
1.502 + return 1;
1.503 + }
1.504 + goto err;
1.505 + }
1.506 + (void)BIO_flush(out);
1.507 + if(errno==ENOMEM)
1.508 + {
1.509 + return 1;
1.510 + }
1.511 + message(out,"BN_mod_sqrt");
1.512 + if (!test_sqrt(out,ctx))
1.513 + {
1.514 + if(errno==ENOMEM)
1.515 + {
1.516 + return 1;
1.517 + }
1.518 + goto err;
1.519 + }
1.520 + (void)BIO_flush(out);
1.521 + if(errno==ENOMEM)
1.522 + {
1.523 + return 1;
1.524 + }
1.525 + message(out,"BN_GF2m_add");
1.526 + if (!test_gf2m_add(out))
1.527 + {
1.528 + if(errno==ENOMEM)
1.529 + {
1.530 + return 1;
1.531 + }
1.532 + goto err;
1.533 + }
1.534 + (void)BIO_flush(out);
1.535 +if(errno==ENOMEM)
1.536 + {
1.537 + return 1;
1.538 + }
1.539 + message(out,"BN_GF2m_mod");
1.540 + if (!test_gf2m_mod(out))
1.541 + {
1.542 + if(errno==ENOMEM)
1.543 + {
1.544 + return 1;
1.545 + }
1.546 + goto err;
1.547 + }
1.548 + (void)BIO_flush(out);
1.549 + if(errno==ENOMEM)
1.550 + {
1.551 + return 1;
1.552 + }
1.553 + message(out,"BN_GF2m_mod_mul");
1.554 + if (!test_gf2m_mod_mul(out,ctx))
1.555 + {
1.556 + if(errno==ENOMEM)
1.557 + {
1.558 + return 1;
1.559 + }
1.560 + goto err;
1.561 + }
1.562 + (void)BIO_flush(out);
1.563 + if(errno==ENOMEM)
1.564 + {
1.565 + return 1;
1.566 + }
1.567 + message(out,"BN_GF2m_mod_sqr");
1.568 + if (!test_gf2m_mod_sqr(out,ctx))
1.569 + {
1.570 + if(errno==ENOMEM)
1.571 + {
1.572 + return 1;
1.573 + }
1.574 + goto err;
1.575 + }
1.576 + (void)BIO_flush(out);
1.577 +if(errno==ENOMEM)
1.578 + {
1.579 + return 1;
1.580 + }
1.581 + message(out,"BN_GF2m_mod_inv");
1.582 + if (!test_gf2m_mod_inv(out,ctx))
1.583 + {
1.584 + if(errno==ENOMEM)
1.585 + {
1.586 + return 1;
1.587 + }
1.588 + goto err;
1.589 + }
1.590 + (void)BIO_flush(out);
1.591 + if(errno==ENOMEM)
1.592 + {
1.593 + return 1;
1.594 + }
1.595 + message(out,"BN_GF2m_mod_div");
1.596 + if (!test_gf2m_mod_div(out,ctx))
1.597 + {
1.598 + if(errno==ENOMEM)
1.599 + {
1.600 + return 1;
1.601 + }
1.602 + goto err;
1.603 + }
1.604 + (void)BIO_flush(out);
1.605 + if(errno==ENOMEM)
1.606 + {
1.607 + return 1;
1.608 + }
1.609 + message(out,"BN_GF2m_mod_exp");
1.610 + if (!test_gf2m_mod_exp(out,ctx))
1.611 + {
1.612 + if(errno==ENOMEM)
1.613 + {
1.614 + return 1;
1.615 + }
1.616 + goto err;
1.617 + }
1.618 + (void)BIO_flush(out);
1.619 + if(errno==ENOMEM)
1.620 + {
1.621 + return 1;
1.622 + }
1.623 + message(out,"BN_GF2m_mod_sqrt");
1.624 + if (!test_gf2m_mod_sqrt(out,ctx))
1.625 + {
1.626 + if(errno==ENOMEM)
1.627 + {
1.628 + return 1;
1.629 + }
1.630 + goto err;
1.631 + }
1.632 + (void)BIO_flush(out);
1.633 + if(errno==ENOMEM)
1.634 + {
1.635 + return 1;
1.636 + }
1.637 + message(out,"BN_GF2m_mod_solve_quad");
1.638 + if (!test_gf2m_mod_solve_quad(out,ctx))
1.639 + {
1.640 + if(errno==ENOMEM)
1.641 + {
1.642 + return 1;
1.643 + }
1.644 + goto err;
1.645 + }
1.646 + (void)BIO_flush(out);
1.647 + if(errno==ENOMEM)
1.648 + {
1.649 + return 1;
1.650 + }
1.651 + BN_CTX_free(ctx);
1.652 + if(errno==ENOMEM)
1.653 + {
1.654 + return 1;
1.655 + }
1.656 + BIO_free(out);
1.657 + if(errno==ENOMEM)
1.658 + {
1.659 + return 1;
1.660 + }
1.661 +#ifdef SYMBIAN
1.662 + CRYPTO_cleanup_all_ex_data();
1.663 + if(errno==ENOMEM)
1.664 + {
1.665 + return 1;
1.666 + }
1.667 + ERR_remove_state(0);
1.668 + if(errno==ENOMEM)
1.669 + {
1.670 + return 1;
1.671 + }
1.672 + ERR_free_strings();
1.673 + if(errno==ENOMEM)
1.674 + {
1.675 + return 1;
1.676 + }
1.677 +
1.678 +#endif
1.679 + fprintf(stderr,"Test case passed!\n");
1.680 + fprintf(stdout,"Test case passed!\n");
1.681 + return 0;
1.682 +err:
1.683 + BIO_puts(out,"1\n"); /* make sure the Perl script fed by bc notices
1.684 + * the failure, see test_bn in test/Makefile.ssl*/
1.685 + if(errno==ENOMEM)
1.686 + {
1.687 + return 1;
1.688 + }
1.689 + (void)BIO_flush(out);
1.690 + if(errno==ENOMEM)
1.691 + {
1.692 + return 1;
1.693 + }
1.694 + ERR_load_crypto_strings();
1.695 + if(errno==ENOMEM)
1.696 + {
1.697 + return 1;
1.698 + }
1.699 + ERR_print_errors_fp(stderr);
1.700 + if(errno==ENOMEM)
1.701 + {
1.702 + return 1;
1.703 + }
1.704 + ERR_remove_state(0);
1.705 + if(errno==ENOMEM)
1.706 + {
1.707 + return 1;
1.708 + }
1.709 + ERR_free_strings();
1.710 + if(errno==ENOMEM)
1.711 + {
1.712 + return 1;
1.713 + }
1.714 +
1.715 + #ifdef SYMBIAN
1.716 + CRYPTO_cleanup_all_ex_data();
1.717 + if(errno==ENOMEM)
1.718 + {
1.719 + return 1;
1.720 + }
1.721 +
1.722 +#endif
1.723 + return(1);
1.724 + }
1.725 +
1.726 +
1.727 +int test_add(BIO *bp)
1.728 + {
1.729 + BIGNUM a,b,c;
1.730 + int i;
1.731 +
1.732 + BN_init(&a);
1.733 +
1.734 + if(errno==ENOMEM)
1.735 + {
1.736 + return 0;
1.737 + }
1.738 + BN_init(&b);
1.739 + if(errno==ENOMEM)
1.740 + {
1.741 + return 0;
1.742 + }
1.743 +
1.744 + BN_init(&c);
1.745 + if(errno==ENOMEM)
1.746 + {
1.747 + return 0;
1.748 + }
1.749 +
1.750 +
1.751 + BN_bntest_rand(&a,512,0,0);
1.752 + if(errno==ENOMEM)
1.753 + {
1.754 + return 0;
1.755 + }
1.756 +
1.757 + for (i=0; i<num0; i++)
1.758 + {
1.759 + BN_bntest_rand(&b,450+i,0,0);
1.760 + if(errno==ENOMEM)
1.761 + {
1.762 + return 0;
1.763 + }
1.764 + a.neg=rand_neg();
1.765 + if(errno==ENOMEM)
1.766 + {
1.767 + return 0;
1.768 + }
1.769 + b.neg=rand_neg();
1.770 + if(errno==ENOMEM)
1.771 + {
1.772 + return 0;
1.773 + }
1.774 + BN_add(&c,&a,&b);
1.775 + if(errno==ENOMEM)
1.776 + {
1.777 + return 0;
1.778 + }
1.779 +
1.780 + if (bp != NULL)
1.781 + {
1.782 + if (!results)
1.783 + {
1.784 + BN_print(bp,&a);
1.785 + if(errno==ENOMEM)
1.786 + {
1.787 + return 0;
1.788 + }
1.789 + BIO_puts(bp," + ");
1.790 + if(errno==ENOMEM)
1.791 + {
1.792 + return 0;
1.793 + }
1.794 +
1.795 + BN_print(bp,&b);
1.796 + if(errno==ENOMEM)
1.797 + {
1.798 + return 0;
1.799 + }
1.800 +
1.801 + BIO_puts(bp," - ");
1.802 + if(errno==ENOMEM)
1.803 + {
1.804 + return 0;
1.805 + }
1.806 +
1.807 + }
1.808 + BN_print(bp,&c);
1.809 + if(errno==ENOMEM)
1.810 + {
1.811 + return 0;
1.812 + }
1.813 +
1.814 + BIO_puts(bp,"\n");
1.815 + if(errno==ENOMEM)
1.816 + {
1.817 + return 0;
1.818 + }
1.819 +
1.820 + }
1.821 + a.neg=!a.neg;
1.822 + b.neg=!b.neg;
1.823 + BN_add(&c,&c,&b);
1.824 + if(errno==ENOMEM)
1.825 + {
1.826 + return 0;
1.827 + }
1.828 +
1.829 + BN_add(&c,&c,&a);
1.830 + if(errno==ENOMEM)
1.831 + {
1.832 + return 0;
1.833 + }
1.834 +
1.835 + if(!BN_is_zero(&c))
1.836 + {
1.837 + if(errno==ENOMEM)
1.838 + {
1.839 + return 0;
1.840 + }
1.841 + fprintf(stderr,"Add test failed!\n");
1.842 + return 0;
1.843 + }
1.844 + }
1.845 + BN_free(&a);
1.846 + if(errno==ENOMEM)
1.847 + {
1.848 + return 0;
1.849 + }
1.850 +
1.851 + BN_free(&b);
1.852 + if(errno==ENOMEM)
1.853 + {
1.854 + return 0;
1.855 + }
1.856 +
1.857 + BN_free(&c);
1.858 + if(errno==ENOMEM)
1.859 + {
1.860 + return 0;
1.861 + }
1.862 + return(1);
1.863 + }
1.864 +
1.865 +int test_sub(BIO *bp)
1.866 + {
1.867 + BIGNUM a,b,c;
1.868 + int i;
1.869 +
1.870 + BN_init(&a);
1.871 + if(errno==ENOMEM)
1.872 + {
1.873 + return 0;
1.874 + }
1.875 +
1.876 + BN_init(&b);
1.877 + if(errno==ENOMEM)
1.878 + {
1.879 + return 0;
1.880 + }
1.881 +
1.882 + BN_init(&c);
1.883 + if(errno==ENOMEM)
1.884 + {
1.885 + return 0;
1.886 + }
1.887 +
1.888 + for (i=0; i<num0+num1; i++)
1.889 + {
1.890 + if (i < num1)
1.891 + {
1.892 + BN_bntest_rand(&a,512,0,0);
1.893 + if(errno==ENOMEM)
1.894 + {
1.895 + return 0;
1.896 + }
1.897 + BN_copy(&b,&a);
1.898 + if(errno==ENOMEM)
1.899 + {
1.900 + return 0;
1.901 + }
1.902 + if (BN_set_bit(&a,i)==0) return(0);
1.903 + if(errno==ENOMEM)
1.904 + {
1.905 + return 0;
1.906 + }
1.907 + BN_add_word(&b,i);
1.908 + if(errno==ENOMEM)
1.909 + {
1.910 + return 0;
1.911 + }
1.912 +
1.913 + }
1.914 + else
1.915 + {
1.916 + BN_bntest_rand(&b,400+i-num1,0,0);
1.917 + if(errno==ENOMEM)
1.918 + {
1.919 + return 0;
1.920 + }
1.921 + a.neg=rand_neg();
1.922 + if(errno==ENOMEM)
1.923 + {
1.924 + return 0;
1.925 + }
1.926 + b.neg=rand_neg();
1.927 + if(errno==ENOMEM)
1.928 + {
1.929 + return 0;
1.930 + }
1.931 +
1.932 + }
1.933 + BN_sub(&c,&a,&b);
1.934 + if(errno==ENOMEM)
1.935 + {
1.936 + return 0;
1.937 + }
1.938 +
1.939 + if (bp != NULL)
1.940 + {
1.941 + if (!results)
1.942 + {
1.943 + BN_print(bp,&a);
1.944 + if(errno==ENOMEM)
1.945 + {
1.946 + return 0;
1.947 + }
1.948 +
1.949 + BIO_puts(bp," - ");
1.950 + if(errno==ENOMEM)
1.951 + {
1.952 + return 0;
1.953 + }
1.954 +
1.955 + BN_print(bp,&b);
1.956 + if(errno==ENOMEM)
1.957 + {
1.958 + return 0;
1.959 + }
1.960 +
1.961 + BIO_puts(bp," - ");
1.962 + if(errno==ENOMEM)
1.963 + {
1.964 + return 0;
1.965 + }
1.966 +
1.967 + }
1.968 + BN_print(bp,&c);
1.969 + if(errno==ENOMEM)
1.970 + {
1.971 + return 0;
1.972 + }
1.973 +
1.974 + BIO_puts(bp,"\n");
1.975 + if(errno==ENOMEM)
1.976 + {
1.977 + return 0;
1.978 + }
1.979 +
1.980 + }
1.981 + BN_add(&c,&c,&b);
1.982 + if(errno==ENOMEM)
1.983 + {
1.984 + return 0;
1.985 + }
1.986 +
1.987 + BN_sub(&c,&c,&a);
1.988 + if(errno==ENOMEM)
1.989 + {
1.990 + return 0;
1.991 + }
1.992 +
1.993 + if(!BN_is_zero(&c))
1.994 + {
1.995 + if(errno==ENOMEM)
1.996 + {
1.997 + return 0;
1.998 + }
1.999 +
1.1000 + fprintf(stderr,"Subtract test failed!\n");
1.1001 + return 0;
1.1002 + }
1.1003 + }
1.1004 + BN_free(&a);
1.1005 + if(errno==ENOMEM)
1.1006 + {
1.1007 + return 0;
1.1008 + }
1.1009 + BN_free(&b);
1.1010 + if(errno==ENOMEM)
1.1011 + {
1.1012 + return 0;
1.1013 + }
1.1014 + BN_free(&c);
1.1015 + if(errno==ENOMEM)
1.1016 + {
1.1017 + return 0;
1.1018 + }
1.1019 + return(1);
1.1020 + }
1.1021 +
1.1022 +int test_div(BIO *bp, BN_CTX *ctx)
1.1023 + {
1.1024 + BIGNUM a,b,c,d,e;
1.1025 + int i;
1.1026 +
1.1027 + BN_init(&a);
1.1028 + if(errno==ENOMEM)
1.1029 + {
1.1030 + return 0;
1.1031 + }
1.1032 +
1.1033 + BN_init(&b);
1.1034 + if(errno==ENOMEM)
1.1035 + {
1.1036 + return 0;
1.1037 + }
1.1038 +
1.1039 + BN_init(&c);
1.1040 + if(errno==ENOMEM)
1.1041 + {
1.1042 + return 0;
1.1043 + }
1.1044 +
1.1045 + BN_init(&d);
1.1046 + if(errno==ENOMEM)
1.1047 + {
1.1048 + return 0;
1.1049 + }
1.1050 +
1.1051 + BN_init(&e);
1.1052 + if(errno==ENOMEM)
1.1053 + {
1.1054 + return 0;
1.1055 + }
1.1056 +
1.1057 +
1.1058 + for (i=0; i<num0+num1; i++)
1.1059 + {
1.1060 + if (i < num1)
1.1061 + {
1.1062 + BN_bntest_rand(&a,400,0,0);
1.1063 + if(errno==ENOMEM)
1.1064 + {
1.1065 + return 0;
1.1066 + }
1.1067 +
1.1068 + BN_copy(&b,&a);
1.1069 + if(errno==ENOMEM)
1.1070 + {
1.1071 + return 0;
1.1072 + }
1.1073 + BN_lshift(&a,&a,i);
1.1074 + if(errno==ENOMEM)
1.1075 + {
1.1076 + return 0;
1.1077 + }
1.1078 + BN_add_word(&a,i);
1.1079 + if(errno==ENOMEM)
1.1080 + {
1.1081 + return 0;
1.1082 + }
1.1083 + }
1.1084 + else
1.1085 + BN_bntest_rand(&b,50+3*(i-num1),0,0);
1.1086 + if(errno==ENOMEM)
1.1087 + {
1.1088 + return 0;
1.1089 + }
1.1090 +
1.1091 + a.neg=rand_neg();
1.1092 + if(errno==ENOMEM)
1.1093 + {
1.1094 + return 0;
1.1095 + }
1.1096 + b.neg=rand_neg();
1.1097 + if(errno==ENOMEM)
1.1098 + {
1.1099 + return 0;
1.1100 + }
1.1101 + BN_div(&d,&c,&a,&b,ctx);
1.1102 + if(errno==ENOMEM)
1.1103 + {
1.1104 + return 0;
1.1105 + }
1.1106 + if (bp != NULL)
1.1107 + {
1.1108 + if (!results)
1.1109 + {
1.1110 + BN_print(bp,&a);
1.1111 + if(errno==ENOMEM)
1.1112 + {
1.1113 + return 0;
1.1114 + }
1.1115 + BIO_puts(bp," / ");
1.1116 + if(errno==ENOMEM)
1.1117 + {
1.1118 + return 0;
1.1119 + }
1.1120 +
1.1121 + BN_print(bp,&b);
1.1122 + if(errno==ENOMEM)
1.1123 + {
1.1124 + return 0;
1.1125 + }
1.1126 +
1.1127 + BIO_puts(bp," - ");
1.1128 + if(errno==ENOMEM)
1.1129 + {
1.1130 + return 0;
1.1131 + }
1.1132 +
1.1133 + }
1.1134 + BN_print(bp,&d);
1.1135 + if(errno==ENOMEM)
1.1136 + {
1.1137 + return 0;
1.1138 + }
1.1139 +
1.1140 + BIO_puts(bp,"\n");
1.1141 + if(errno==ENOMEM)
1.1142 + {
1.1143 + return 0;
1.1144 + }
1.1145 +
1.1146 +
1.1147 + if (!results)
1.1148 + {
1.1149 + BN_print(bp,&a);
1.1150 + if(errno==ENOMEM)
1.1151 + {
1.1152 + return 0;
1.1153 + }
1.1154 +
1.1155 + BIO_puts(bp," % ");
1.1156 + if(errno==ENOMEM)
1.1157 + {
1.1158 + return 0;
1.1159 + }
1.1160 +
1.1161 + BN_print(bp,&b);
1.1162 + if(errno==ENOMEM)
1.1163 + {
1.1164 + return 0;
1.1165 + }
1.1166 +
1.1167 + BIO_puts(bp," - ");
1.1168 + if(errno==ENOMEM)
1.1169 + {
1.1170 + return 0;
1.1171 + }
1.1172 +
1.1173 + }
1.1174 + BN_print(bp,&c);
1.1175 + if(errno==ENOMEM)
1.1176 + {
1.1177 + return 0;
1.1178 + }
1.1179 +
1.1180 + BIO_puts(bp,"\n");
1.1181 + if(errno==ENOMEM)
1.1182 + {
1.1183 + return 0;
1.1184 + }
1.1185 +
1.1186 + }
1.1187 + BN_mul(&e,&d,&b,ctx);
1.1188 + if(errno==ENOMEM)
1.1189 + {
1.1190 + return 0;
1.1191 + }
1.1192 +
1.1193 + BN_add(&d,&e,&c);
1.1194 + if(errno==ENOMEM)
1.1195 + {
1.1196 + return 0;
1.1197 + }
1.1198 +
1.1199 + BN_sub(&d,&d,&a);
1.1200 + if(errno==ENOMEM)
1.1201 + {
1.1202 + return 0;
1.1203 + }
1.1204 +
1.1205 + if(!BN_is_zero(&d))
1.1206 + {
1.1207 + if(errno==ENOMEM)
1.1208 + {
1.1209 + return 0;
1.1210 + }
1.1211 +
1.1212 + fprintf(stderr,"Division test failed!\n");
1.1213 + return 0;
1.1214 + }
1.1215 + }
1.1216 + BN_free(&a);
1.1217 + if(errno==ENOMEM)
1.1218 + {
1.1219 + return 0;
1.1220 + }
1.1221 +
1.1222 + BN_free(&b);
1.1223 + if(errno==ENOMEM)
1.1224 + {
1.1225 + return 0;
1.1226 + }
1.1227 +
1.1228 + BN_free(&c);
1.1229 + if(errno==ENOMEM)
1.1230 + {
1.1231 + return 0;
1.1232 + }
1.1233 +
1.1234 + BN_free(&d);
1.1235 + if(errno==ENOMEM)
1.1236 + {
1.1237 + return 0;
1.1238 + }
1.1239 +
1.1240 + BN_free(&e);
1.1241 + if(errno==ENOMEM)
1.1242 + {
1.1243 + return 0;
1.1244 + }
1.1245 +
1.1246 + return(1);
1.1247 + }
1.1248 +
1.1249 +static void print_word(BIO *bp,BN_ULONG w)
1.1250 + {
1.1251 +#ifdef SIXTY_FOUR_BIT
1.1252 + if (sizeof(w) > sizeof(unsigned long))
1.1253 + {
1.1254 + unsigned long h=(unsigned long)(w>>32),
1.1255 + l=(unsigned long)(w);
1.1256 +
1.1257 + if (h) BIO_printf(bp,"%lX%08lX",h,l);
1.1258 + else BIO_printf(bp,"%lX",l);
1.1259 + return;
1.1260 + }
1.1261 +#endif
1.1262 + BIO_printf(bp,"%lX",w);
1.1263 + }
1.1264 +
1.1265 +int test_div_word(BIO *bp)
1.1266 + {
1.1267 + BIGNUM a,b;
1.1268 + BN_ULONG r,s;
1.1269 + int i;
1.1270 +
1.1271 + BN_init(&a);
1.1272 + if(errno==ENOMEM)
1.1273 + {
1.1274 + return 0;
1.1275 + }
1.1276 + BN_init(&b);
1.1277 + if(errno==ENOMEM)
1.1278 + {
1.1279 + return 0;
1.1280 + }
1.1281 +
1.1282 +
1.1283 + for (i=0; i<num0; i++)
1.1284 + {
1.1285 + do {
1.1286 + BN_bntest_rand(&a,512,-1,0);
1.1287 + if(errno==ENOMEM)
1.1288 + {
1.1289 + return 0;
1.1290 + }
1.1291 + BN_bntest_rand(&b,BN_BITS2,-1,0);
1.1292 + if(errno==ENOMEM)
1.1293 + {
1.1294 + return 0;
1.1295 + }
1.1296 + s = b.d[0];
1.1297 + } while (!s);
1.1298 +
1.1299 + BN_copy(&b, &a);
1.1300 + if(errno==ENOMEM)
1.1301 + {
1.1302 + return 0;
1.1303 + }
1.1304 +
1.1305 + r = BN_div_word(&b, s);
1.1306 + if(errno==ENOMEM)
1.1307 + {
1.1308 + return 0;
1.1309 + }
1.1310 +
1.1311 + if (bp != NULL)
1.1312 + {
1.1313 + if (!results)
1.1314 + {
1.1315 + BN_print(bp,&a);
1.1316 + if(errno==ENOMEM)
1.1317 + {
1.1318 + return 0;
1.1319 + }
1.1320 +
1.1321 + BIO_puts(bp," / ");
1.1322 + if(errno==ENOMEM)
1.1323 + {
1.1324 + return 0;
1.1325 + }
1.1326 +
1.1327 + print_word(bp,s);
1.1328 + if(errno==ENOMEM)
1.1329 + {
1.1330 + return 0;
1.1331 + }
1.1332 +
1.1333 + BIO_puts(bp," - ");
1.1334 + if(errno==ENOMEM)
1.1335 + {
1.1336 + return 0;
1.1337 + }
1.1338 +
1.1339 + }
1.1340 + BN_print(bp,&b);
1.1341 + if(errno==ENOMEM)
1.1342 + {
1.1343 + return 0;
1.1344 + }
1.1345 +
1.1346 + BIO_puts(bp,"\n");
1.1347 + if(errno==ENOMEM)
1.1348 + {
1.1349 + return 0;
1.1350 + }
1.1351 +
1.1352 +
1.1353 + if (!results)
1.1354 + {
1.1355 + BN_print(bp,&a);
1.1356 + if(errno==ENOMEM)
1.1357 + {
1.1358 + return 0;
1.1359 + }
1.1360 + BIO_puts(bp," % ");
1.1361 + if(errno==ENOMEM)
1.1362 + {
1.1363 + return 0;
1.1364 + }
1.1365 + print_word(bp,s);
1.1366 + if(errno==ENOMEM)
1.1367 + {
1.1368 + return 0;
1.1369 + }
1.1370 + BIO_puts(bp," - ");
1.1371 + if(errno==ENOMEM)
1.1372 + {
1.1373 + return 0;
1.1374 + }
1.1375 +
1.1376 + }
1.1377 + print_word(bp,r);
1.1378 + if(errno==ENOMEM)
1.1379 + {
1.1380 + return 0;
1.1381 + }
1.1382 +
1.1383 + BIO_puts(bp,"\n");
1.1384 + if(errno==ENOMEM)
1.1385 + {
1.1386 + return 0;
1.1387 + }
1.1388 +
1.1389 + }
1.1390 + BN_mul_word(&b,s);
1.1391 + if(errno==ENOMEM)
1.1392 + {
1.1393 + return 0;
1.1394 + }
1.1395 + BN_add_word(&b,r);
1.1396 + if(errno==ENOMEM)
1.1397 + {
1.1398 + return 0;
1.1399 + }
1.1400 +
1.1401 + BN_sub(&b,&a,&b);
1.1402 + if(errno==ENOMEM)
1.1403 + {
1.1404 + return 0;
1.1405 + }
1.1406 +
1.1407 + if(!BN_is_zero(&b))
1.1408 + {
1.1409 + if(errno==ENOMEM)
1.1410 + {
1.1411 + return 0;
1.1412 + }
1.1413 + fprintf(stderr,"Division (word) test failed!\n");
1.1414 + return 0;
1.1415 + }
1.1416 + }
1.1417 + BN_free(&a);
1.1418 + if(errno==ENOMEM)
1.1419 + {
1.1420 + return 0;
1.1421 + }
1.1422 +
1.1423 + BN_free(&b);
1.1424 + if(errno==ENOMEM)
1.1425 + {
1.1426 + return 0;
1.1427 + }
1.1428 +
1.1429 + return(1);
1.1430 + }
1.1431 +
1.1432 +int test_div_recp(BIO *bp, BN_CTX *ctx)
1.1433 + {
1.1434 + BIGNUM a,b,c,d,e;
1.1435 + BN_RECP_CTX recp;
1.1436 + int i;
1.1437 +
1.1438 + BN_RECP_CTX_init(&recp);
1.1439 + if(errno==ENOMEM)
1.1440 + {
1.1441 + return 0;
1.1442 + }
1.1443 +
1.1444 + BN_init(&a);
1.1445 + if(errno==ENOMEM)
1.1446 + {
1.1447 + return 0;
1.1448 + }
1.1449 +
1.1450 + BN_init(&b);
1.1451 + if(errno==ENOMEM)
1.1452 + {
1.1453 + return 0;
1.1454 + }
1.1455 +
1.1456 + BN_init(&c);
1.1457 + if(errno==ENOMEM)
1.1458 + {
1.1459 + return 0;
1.1460 + }
1.1461 +
1.1462 + BN_init(&d);
1.1463 + if(errno==ENOMEM)
1.1464 + {
1.1465 + return 0;
1.1466 + }
1.1467 +
1.1468 + BN_init(&e);
1.1469 + if(errno==ENOMEM)
1.1470 + {
1.1471 + return 0;
1.1472 + }
1.1473 +
1.1474 +
1.1475 + for (i=0; i<num0+num1; i++)
1.1476 + {
1.1477 + if (i < num1)
1.1478 + {
1.1479 + BN_bntest_rand(&a,400,0,0);
1.1480 + if(errno==ENOMEM)
1.1481 + {
1.1482 + return 0;
1.1483 + }
1.1484 + BN_copy(&b,&a);
1.1485 + if(errno==ENOMEM)
1.1486 + {
1.1487 + return 0;
1.1488 + }
1.1489 + BN_lshift(&a,&a,i);
1.1490 + if(errno==ENOMEM)
1.1491 + {
1.1492 + return 0;
1.1493 + }
1.1494 + BN_add_word(&a,i);
1.1495 + if(errno==ENOMEM)
1.1496 + {
1.1497 + return 0;
1.1498 + }
1.1499 +
1.1500 + }
1.1501 + else
1.1502 + BN_bntest_rand(&b,50+3*(i-num1),0,0);
1.1503 + if(errno==ENOMEM)
1.1504 + {
1.1505 + return 0;
1.1506 + }
1.1507 +
1.1508 + a.neg=rand_neg();
1.1509 + if(errno==ENOMEM)
1.1510 + {
1.1511 + return 0;
1.1512 + }
1.1513 +
1.1514 + b.neg=rand_neg();
1.1515 + if(errno==ENOMEM)
1.1516 + {
1.1517 + return 0;
1.1518 + }
1.1519 +
1.1520 + BN_RECP_CTX_set(&recp,&b,ctx);
1.1521 + if(errno==ENOMEM)
1.1522 + {
1.1523 + return 0;
1.1524 + }
1.1525 +
1.1526 + BN_div_recp(&d,&c,&a,&recp,ctx);
1.1527 + if(errno==ENOMEM)
1.1528 + {
1.1529 + return 0;
1.1530 + }
1.1531 +
1.1532 + if (bp != NULL)
1.1533 + {
1.1534 + if (!results)
1.1535 + {
1.1536 + BN_print(bp,&a);
1.1537 + if(errno==ENOMEM)
1.1538 + {
1.1539 + return 0;
1.1540 + }
1.1541 +
1.1542 + BIO_puts(bp," / ");
1.1543 + if(errno==ENOMEM)
1.1544 + {
1.1545 + return 0;
1.1546 + }
1.1547 +
1.1548 + BN_print(bp,&b);
1.1549 + if(errno==ENOMEM)
1.1550 + {
1.1551 + return 0;
1.1552 + }
1.1553 +
1.1554 + BIO_puts(bp," - ");
1.1555 + if(errno==ENOMEM)
1.1556 + {
1.1557 + return 0;
1.1558 + }
1.1559 +
1.1560 + }
1.1561 + BN_print(bp,&d);
1.1562 + if(errno==ENOMEM)
1.1563 + {
1.1564 + return 0;
1.1565 + }
1.1566 +
1.1567 + BIO_puts(bp,"\n");
1.1568 + if(errno==ENOMEM)
1.1569 + {
1.1570 + return 0;
1.1571 + }
1.1572 +
1.1573 +
1.1574 + if (!results)
1.1575 + {
1.1576 + BN_print(bp,&a);
1.1577 + if(errno==ENOMEM)
1.1578 + {
1.1579 + return 0;
1.1580 + }
1.1581 +
1.1582 + BIO_puts(bp," % ");
1.1583 + if(errno==ENOMEM)
1.1584 + {
1.1585 + return 0;
1.1586 + }
1.1587 +
1.1588 + BN_print(bp,&b);
1.1589 + if(errno==ENOMEM)
1.1590 + {
1.1591 + return 0;
1.1592 + }
1.1593 + BIO_puts(bp," - ");
1.1594 + if(errno==ENOMEM)
1.1595 + {
1.1596 + return 0;
1.1597 + }
1.1598 +
1.1599 + }
1.1600 + BN_print(bp,&c);
1.1601 + if(errno==ENOMEM)
1.1602 + {
1.1603 + return 0;
1.1604 + }
1.1605 +
1.1606 + BIO_puts(bp,"\n");
1.1607 + if(errno==ENOMEM)
1.1608 + {
1.1609 + return 0;
1.1610 + }
1.1611 +
1.1612 + }
1.1613 + BN_mul(&e,&d,&b,ctx);
1.1614 + if(errno==ENOMEM)
1.1615 + {
1.1616 + return 0;
1.1617 + }
1.1618 +
1.1619 + BN_add(&d,&e,&c);
1.1620 + if(errno==ENOMEM)
1.1621 + {
1.1622 + return 0;
1.1623 + }
1.1624 +
1.1625 + BN_sub(&d,&d,&a);
1.1626 + if(errno==ENOMEM)
1.1627 + {
1.1628 + return 0;
1.1629 + }
1.1630 +
1.1631 + if(!BN_is_zero(&d))
1.1632 + {
1.1633 + if(errno==ENOMEM)
1.1634 + {
1.1635 + return 0;
1.1636 + }
1.1637 + fprintf(stderr,"Reciprocal division test failed!\n");
1.1638 + fprintf(stderr,"a=");
1.1639 + BN_print_fp(stderr,&a);
1.1640 + if(errno==ENOMEM)
1.1641 + {
1.1642 + return 0;
1.1643 + }
1.1644 +
1.1645 + fprintf(stderr,"\nb=");
1.1646 + BN_print_fp(stderr,&b);
1.1647 + if(errno==ENOMEM)
1.1648 + {
1.1649 + return 0;
1.1650 + }
1.1651 +
1.1652 + fprintf(stderr,"\n");
1.1653 + return 0;
1.1654 + }
1.1655 + }
1.1656 + BN_free(&a);
1.1657 + if(errno==ENOMEM)
1.1658 + {
1.1659 + return 0;
1.1660 + }
1.1661 + BN_free(&b);
1.1662 + if(errno==ENOMEM)
1.1663 + {
1.1664 + return 0;
1.1665 + }
1.1666 +
1.1667 + BN_free(&c);
1.1668 + if(errno==ENOMEM)
1.1669 + {
1.1670 + return 0;
1.1671 + }
1.1672 +
1.1673 + BN_free(&d);
1.1674 + if(errno==ENOMEM)
1.1675 + {
1.1676 + return 0;
1.1677 + }
1.1678 +
1.1679 + BN_free(&e);
1.1680 + if(errno==ENOMEM)
1.1681 + {
1.1682 + return 0;
1.1683 + }
1.1684 +
1.1685 + BN_RECP_CTX_free(&recp);
1.1686 + if(errno==ENOMEM)
1.1687 + {
1.1688 + return 0;
1.1689 + }
1.1690 +
1.1691 + return(1);
1.1692 + }
1.1693 +
1.1694 +int test_mul(BIO *bp)
1.1695 + {
1.1696 + BIGNUM a,b,c,d,e;
1.1697 + int i;
1.1698 + BN_CTX *ctx;
1.1699 +
1.1700 + ctx = BN_CTX_new();
1.1701 + if (ctx == NULL)
1.1702 + return 1;
1.1703 +
1.1704 + BN_init(&a);
1.1705 + if(errno==ENOMEM)
1.1706 + {
1.1707 + return 0;
1.1708 + }
1.1709 + BN_init(&b);
1.1710 + if(errno==ENOMEM)
1.1711 + {
1.1712 + return 0;
1.1713 + }
1.1714 + BN_init(&c);
1.1715 + if(errno==ENOMEM)
1.1716 + {
1.1717 + return 0;
1.1718 + }
1.1719 + BN_init(&d);
1.1720 + if(errno==ENOMEM)
1.1721 + {
1.1722 + return 0;
1.1723 + }
1.1724 + BN_init(&e);
1.1725 + if(errno==ENOMEM)
1.1726 + {
1.1727 + return 0;
1.1728 + }
1.1729 +
1.1730 + for (i=0; i<num0+num1; i++)
1.1731 + {
1.1732 + if (i <= num1)
1.1733 + {
1.1734 + BN_bntest_rand(&a,100,0,0);
1.1735 + if(errno==ENOMEM)
1.1736 + {
1.1737 + return 0;
1.1738 + }
1.1739 + BN_bntest_rand(&b,100,0,0);
1.1740 + if(errno==ENOMEM)
1.1741 + {
1.1742 + return 0;
1.1743 + }
1.1744 + }
1.1745 + else
1.1746 + BN_bntest_rand(&b,i-num1,0,0);
1.1747 + if(errno==ENOMEM)
1.1748 + {
1.1749 + return 0;
1.1750 + }
1.1751 + a.neg=rand_neg();
1.1752 + if(errno==ENOMEM)
1.1753 + {
1.1754 + return 0;
1.1755 + }
1.1756 + b.neg=rand_neg();
1.1757 + if(errno==ENOMEM)
1.1758 + {
1.1759 + return 0;
1.1760 + }
1.1761 + BN_mul(&c,&a,&b,ctx);
1.1762 + if(errno==ENOMEM)
1.1763 + {
1.1764 + return 0;
1.1765 + }
1.1766 + if (bp != NULL)
1.1767 + {
1.1768 + if (!results)
1.1769 + {
1.1770 + BN_print(bp,&a);
1.1771 + if(errno==ENOMEM)
1.1772 + {
1.1773 + return 0;
1.1774 + }
1.1775 + BIO_puts(bp," * ");
1.1776 + if(errno==ENOMEM)
1.1777 + {
1.1778 + return 0;
1.1779 + }
1.1780 + BN_print(bp,&b);
1.1781 + if(errno==ENOMEM)
1.1782 + {
1.1783 + return 0;
1.1784 + }
1.1785 + BIO_puts(bp," - ");
1.1786 + if(errno==ENOMEM)
1.1787 + {
1.1788 + return 0;
1.1789 + }
1.1790 + }
1.1791 + BN_print(bp,&c);
1.1792 + if(errno==ENOMEM)
1.1793 + {
1.1794 + return 0;
1.1795 + }
1.1796 + BIO_puts(bp,"\n");
1.1797 + if(errno==ENOMEM)
1.1798 + {
1.1799 + return 0;
1.1800 + }
1.1801 + }
1.1802 + BN_div(&d,&e,&c,&a,ctx);
1.1803 + if(errno==ENOMEM)
1.1804 + {
1.1805 + return 0;
1.1806 + }
1.1807 + BN_sub(&d,&d,&b);
1.1808 + if(errno==ENOMEM)
1.1809 + {
1.1810 + return 0;
1.1811 + }
1.1812 + if(!BN_is_zero(&d) || !BN_is_zero(&e))
1.1813 + {
1.1814 + if(errno==ENOMEM)
1.1815 + {
1.1816 + return 0;
1.1817 + }
1.1818 + fprintf(stderr,"Multiplication test failed!\n");
1.1819 + return 0;
1.1820 + }
1.1821 + }
1.1822 + BN_free(&a);
1.1823 + if(errno==ENOMEM)
1.1824 + {
1.1825 + return 0;
1.1826 + }
1.1827 + BN_free(&b);
1.1828 + if(errno==ENOMEM)
1.1829 + {
1.1830 + return 0;
1.1831 + }
1.1832 + BN_free(&c);
1.1833 + if(errno==ENOMEM)
1.1834 + {
1.1835 + return 0;
1.1836 + }
1.1837 + BN_free(&d);
1.1838 + if(errno==ENOMEM)
1.1839 + {
1.1840 + return 0;
1.1841 + }
1.1842 + BN_free(&e);
1.1843 + if(errno==ENOMEM)
1.1844 + {
1.1845 + return 0;
1.1846 + }
1.1847 + BN_CTX_free(ctx);
1.1848 + if(errno==ENOMEM)
1.1849 + {
1.1850 + return 0;
1.1851 + }
1.1852 + return(1);
1.1853 + }
1.1854 +
1.1855 +int test_sqr(BIO *bp, BN_CTX *ctx)
1.1856 + {
1.1857 + BIGNUM a,c,d,e;
1.1858 + int i;
1.1859 +
1.1860 + BN_init(&a);
1.1861 + if(errno==ENOMEM)
1.1862 + {
1.1863 + return 0;
1.1864 + }
1.1865 + BN_init(&c);
1.1866 + if(errno==ENOMEM)
1.1867 + {
1.1868 + return 0;
1.1869 + }
1.1870 + BN_init(&d);
1.1871 + if(errno==ENOMEM)
1.1872 + {
1.1873 + return 0;
1.1874 + }
1.1875 + BN_init(&e);
1.1876 + if(errno==ENOMEM)
1.1877 + {
1.1878 + return 0;
1.1879 + }
1.1880 +
1.1881 + for (i=0; i<num0; i++)
1.1882 + {
1.1883 + BN_bntest_rand(&a,40+i*10,0,0);
1.1884 + if(errno==ENOMEM)
1.1885 + {
1.1886 + return 0;
1.1887 + }
1.1888 + a.neg=rand_neg();
1.1889 + if(errno==ENOMEM)
1.1890 + {
1.1891 + return 0;
1.1892 + }
1.1893 + BN_sqr(&c,&a,ctx);
1.1894 + if(errno==ENOMEM)
1.1895 + {
1.1896 + return 0;
1.1897 + }
1.1898 + if (bp != NULL)
1.1899 + {
1.1900 + if (!results)
1.1901 + {
1.1902 + BN_print(bp,&a);
1.1903 + if(errno==ENOMEM)
1.1904 + {
1.1905 + return 0;
1.1906 + }
1.1907 + BIO_puts(bp," * ");
1.1908 + if(errno==ENOMEM)
1.1909 + {
1.1910 + return 0;
1.1911 + }
1.1912 + BN_print(bp,&a);
1.1913 + if(errno==ENOMEM)
1.1914 + {
1.1915 + return 0;
1.1916 + }
1.1917 + BIO_puts(bp," - ");
1.1918 + if(errno==ENOMEM)
1.1919 + {
1.1920 + return 0;
1.1921 + }
1.1922 + }
1.1923 + BN_print(bp,&c);
1.1924 + if(errno==ENOMEM)
1.1925 + {
1.1926 + return 0;
1.1927 + }
1.1928 + BIO_puts(bp,"\n");
1.1929 + if(errno==ENOMEM)
1.1930 + {
1.1931 + return 0;
1.1932 + }
1.1933 + }
1.1934 + BN_div(&d,&e,&c,&a,ctx);
1.1935 + if(errno==ENOMEM)
1.1936 + {
1.1937 + return 0;
1.1938 + }
1.1939 + BN_sub(&d,&d,&a);
1.1940 + if(errno==ENOMEM)
1.1941 + {
1.1942 + return 0;
1.1943 + }
1.1944 + if(!BN_is_zero(&d) || !BN_is_zero(&e))
1.1945 + {
1.1946 + if(errno==ENOMEM)
1.1947 + {
1.1948 + return 0;
1.1949 + }
1.1950 + fprintf(stderr,"Square test failed!\n");
1.1951 + return 0;
1.1952 + }
1.1953 + }
1.1954 + BN_free(&a);
1.1955 + if(errno==ENOMEM)
1.1956 + {
1.1957 + return 0;
1.1958 + }
1.1959 + BN_free(&c);
1.1960 + if(errno==ENOMEM)
1.1961 + {
1.1962 + return 0;
1.1963 + }
1.1964 + BN_free(&d);
1.1965 + if(errno==ENOMEM)
1.1966 + {
1.1967 + return 0;
1.1968 + }
1.1969 + BN_free(&e);
1.1970 + if(errno==ENOMEM)
1.1971 + {
1.1972 + return 0;
1.1973 + }
1.1974 + return(1);
1.1975 + }
1.1976 +
1.1977 +int test_mont(BIO *bp, BN_CTX *ctx)
1.1978 + {
1.1979 + BIGNUM a,b,c,d,A,B;
1.1980 + BIGNUM n;
1.1981 + int i;
1.1982 + BN_MONT_CTX *mont;
1.1983 +
1.1984 + BN_init(&a);
1.1985 + if(errno==ENOMEM)
1.1986 + {
1.1987 + return 0;
1.1988 + }
1.1989 + BN_init(&b);
1.1990 + if(errno==ENOMEM)
1.1991 + {
1.1992 + return 0;
1.1993 + }
1.1994 + BN_init(&c);
1.1995 + if(errno==ENOMEM)
1.1996 + {
1.1997 + return 0;
1.1998 + }
1.1999 + BN_init(&d);
1.2000 + if(errno==ENOMEM)
1.2001 + {
1.2002 + return 0;
1.2003 + }
1.2004 + BN_init(&A);
1.2005 + if(errno==ENOMEM)
1.2006 + {
1.2007 + return 0;
1.2008 + }
1.2009 + BN_init(&B);
1.2010 + if(errno==ENOMEM)
1.2011 + {
1.2012 + return 0;
1.2013 + }
1.2014 + BN_init(&n);
1.2015 + if(errno==ENOMEM)
1.2016 + {
1.2017 + return 0;
1.2018 + }
1.2019 +
1.2020 + mont=BN_MONT_CTX_new();
1.2021 + if(errno==ENOMEM)
1.2022 + {
1.2023 + return 0;
1.2024 + }
1.2025 +
1.2026 + BN_bntest_rand(&a,100,0,0); /**/
1.2027 + if(errno==ENOMEM)
1.2028 + {
1.2029 + return 0;
1.2030 + }
1.2031 + BN_bntest_rand(&b,100,0,0); /**/
1.2032 + if(errno==ENOMEM)
1.2033 + {
1.2034 + return 0;
1.2035 + }
1.2036 + for (i=0; i<num2; i++)
1.2037 + {
1.2038 + int bits = (200*(i+1))/num2;
1.2039 +
1.2040 + if (bits == 0)
1.2041 + continue;
1.2042 + BN_bntest_rand(&n,bits,0,1);
1.2043 + if(errno==ENOMEM)
1.2044 + {
1.2045 + return 0;
1.2046 + }
1.2047 + BN_MONT_CTX_set(mont,&n,ctx);
1.2048 + if(errno==ENOMEM)
1.2049 + {
1.2050 + return 0;
1.2051 + }
1.2052 +
1.2053 + BN_nnmod(&a,&a,&n,ctx);
1.2054 + if(errno==ENOMEM)
1.2055 + {
1.2056 + return 0;
1.2057 + }
1.2058 + BN_nnmod(&b,&b,&n,ctx);
1.2059 + if(errno==ENOMEM)
1.2060 + {
1.2061 + return 0;
1.2062 + }
1.2063 +
1.2064 + BN_to_montgomery(&A,&a,mont,ctx);
1.2065 + if(errno==ENOMEM)
1.2066 + {
1.2067 + return 0;
1.2068 + }
1.2069 + BN_to_montgomery(&B,&b,mont,ctx);
1.2070 + if(errno==ENOMEM)
1.2071 + {
1.2072 + return 0;
1.2073 + }
1.2074 +
1.2075 + BN_mod_mul_montgomery(&c,&A,&B,mont,ctx);/**/
1.2076 + if(errno==ENOMEM)
1.2077 + {
1.2078 + return 0;
1.2079 + }
1.2080 + BN_from_montgomery(&A,&c,mont,ctx);/**/
1.2081 + if(errno==ENOMEM)
1.2082 + {
1.2083 + return 0;
1.2084 + }
1.2085 + if (bp != NULL)
1.2086 + {
1.2087 + if (!results)
1.2088 + {
1.2089 +#ifdef undef
1.2090 +fprintf(stderr,"%d * %d %% %d\n",
1.2091 +BN_num_bits(&a),
1.2092 +BN_num_bits(&b),
1.2093 +BN_num_bits(mont->N));
1.2094 +#endif
1.2095 + BN_print(bp,&a);
1.2096 + if(errno==ENOMEM)
1.2097 + {
1.2098 + return 0;
1.2099 + }
1.2100 + BIO_puts(bp," * ");
1.2101 + if(errno==ENOMEM)
1.2102 + {
1.2103 + return 0;
1.2104 + }
1.2105 + BN_print(bp,&b);
1.2106 + if(errno==ENOMEM)
1.2107 + {
1.2108 + return 0;
1.2109 + }
1.2110 + BIO_puts(bp," % ");
1.2111 + if(errno==ENOMEM)
1.2112 + {
1.2113 + return 0;
1.2114 + }
1.2115 + BN_print(bp,&(mont->N));
1.2116 + if(errno==ENOMEM)
1.2117 + {
1.2118 + return 0;
1.2119 + }
1.2120 + BIO_puts(bp," - ");
1.2121 + if(errno==ENOMEM)
1.2122 + {
1.2123 + return 0;
1.2124 + }
1.2125 + }
1.2126 + BN_print(bp,&A);
1.2127 + if(errno==ENOMEM)
1.2128 + {
1.2129 + return 0;
1.2130 + }
1.2131 + BIO_puts(bp,"\n");
1.2132 + if(errno==ENOMEM)
1.2133 + {
1.2134 + return 0;
1.2135 + }
1.2136 + }
1.2137 + BN_mod_mul(&d,&a,&b,&n,ctx);
1.2138 + if(errno==ENOMEM)
1.2139 + {
1.2140 + return 0;
1.2141 + }
1.2142 + BN_sub(&d,&d,&A);
1.2143 + if(errno==ENOMEM)
1.2144 + {
1.2145 + return 0;
1.2146 + }
1.2147 + if(!BN_is_zero(&d))
1.2148 + {
1.2149 + if(errno==ENOMEM)
1.2150 + {
1.2151 + return 0;
1.2152 + }
1.2153 + fprintf(stderr,"Montgomery multiplication test failed!\n");
1.2154 + return 0;
1.2155 + }
1.2156 + }
1.2157 + BN_MONT_CTX_free(mont);
1.2158 + if(errno==ENOMEM)
1.2159 + {
1.2160 + return 0;
1.2161 + }
1.2162 + BN_free(&a);
1.2163 + if(errno==ENOMEM)
1.2164 + {
1.2165 + return 0;
1.2166 + }
1.2167 + BN_free(&b);
1.2168 + if(errno==ENOMEM)
1.2169 + {
1.2170 + return 0;
1.2171 + }
1.2172 + BN_free(&c);
1.2173 + if(errno==ENOMEM)
1.2174 + {
1.2175 + return 0;
1.2176 + }
1.2177 + BN_free(&d);
1.2178 + if(errno==ENOMEM)
1.2179 + {
1.2180 + return 0;
1.2181 + }
1.2182 + BN_free(&A);
1.2183 + if(errno==ENOMEM)
1.2184 + {
1.2185 + return 0;
1.2186 + }
1.2187 + BN_free(&B);
1.2188 + if(errno==ENOMEM)
1.2189 + {
1.2190 + return 0;
1.2191 + }
1.2192 + BN_free(&n);
1.2193 + if(errno==ENOMEM)
1.2194 + {
1.2195 + return 0;
1.2196 + }
1.2197 + return(1);
1.2198 + }
1.2199 +
1.2200 +int test_mod(BIO *bp, BN_CTX *ctx)
1.2201 + {
1.2202 + BIGNUM *a,*b,*c,*d,*e;
1.2203 + int i;
1.2204 +
1.2205 + a=BN_new();
1.2206 + if(errno==ENOMEM)
1.2207 + {
1.2208 + return 0;
1.2209 + }
1.2210 + b=BN_new();
1.2211 + if(errno==ENOMEM)
1.2212 + {
1.2213 + return 0;
1.2214 + }
1.2215 + c=BN_new();
1.2216 + if(errno==ENOMEM)
1.2217 + {
1.2218 + return 0;
1.2219 + }
1.2220 + d=BN_new();
1.2221 + if(errno==ENOMEM)
1.2222 + {
1.2223 + return 0;
1.2224 + }
1.2225 + e=BN_new();
1.2226 + if(errno==ENOMEM)
1.2227 + {
1.2228 + return 0;
1.2229 + }
1.2230 +
1.2231 + BN_bntest_rand(a,1024,0,0); /**/
1.2232 + if(errno==ENOMEM)
1.2233 + {
1.2234 + return 0;
1.2235 + }
1.2236 + for (i=0; i<num0; i++)
1.2237 + {
1.2238 + BN_bntest_rand(b,450+i*10,0,0); /**/
1.2239 + if(errno==ENOMEM)
1.2240 + {
1.2241 + return 0;
1.2242 + }
1.2243 + a->neg=rand_neg();
1.2244 + if(errno==ENOMEM)
1.2245 + {
1.2246 + return 0;
1.2247 + }
1.2248 + b->neg=rand_neg();
1.2249 + if(errno==ENOMEM)
1.2250 + {
1.2251 + return 0;
1.2252 + }
1.2253 + BN_mod(c,a,b,ctx);/**/
1.2254 + if(errno==ENOMEM)
1.2255 + {
1.2256 + return 0;
1.2257 + }
1.2258 + if (bp != NULL)
1.2259 + {
1.2260 + if (!results)
1.2261 + {
1.2262 + BN_print(bp,a);
1.2263 + if(errno==ENOMEM)
1.2264 + {
1.2265 + return 0;
1.2266 + }
1.2267 + BIO_puts(bp," % ");
1.2268 + if(errno==ENOMEM)
1.2269 + {
1.2270 + return 0;
1.2271 + }
1.2272 + BN_print(bp,b);
1.2273 + if(errno==ENOMEM)
1.2274 + {
1.2275 + return 0;
1.2276 + }
1.2277 + BIO_puts(bp," - ");
1.2278 + if(errno==ENOMEM)
1.2279 + {
1.2280 + return 0;
1.2281 + }
1.2282 + }
1.2283 + BN_print(bp,c);
1.2284 + if(errno==ENOMEM)
1.2285 + {
1.2286 + return 0;
1.2287 + }
1.2288 + BIO_puts(bp,"\n");
1.2289 + if(errno==ENOMEM)
1.2290 + {
1.2291 + return 0;
1.2292 + }
1.2293 + }
1.2294 + BN_div(d,e,a,b,ctx);
1.2295 + if(errno==ENOMEM)
1.2296 + {
1.2297 + return 0;
1.2298 + }
1.2299 + BN_sub(e,e,c);
1.2300 + if(errno==ENOMEM)
1.2301 + {
1.2302 + return 0;
1.2303 + }
1.2304 + if(!BN_is_zero(e))
1.2305 + {
1.2306 + if(errno==ENOMEM)
1.2307 + {
1.2308 + return 0;
1.2309 + }
1.2310 + fprintf(stderr,"Modulo test failed!\n");
1.2311 + return 0;
1.2312 + }
1.2313 + }
1.2314 + BN_free(a);
1.2315 + if(errno==ENOMEM)
1.2316 + {
1.2317 + return 0;
1.2318 + }
1.2319 + BN_free(b);
1.2320 + if(errno==ENOMEM)
1.2321 + {
1.2322 + return 0;
1.2323 + }
1.2324 + BN_free(c);
1.2325 + if(errno==ENOMEM)
1.2326 + {
1.2327 + return 0;
1.2328 + }
1.2329 + BN_free(d);
1.2330 + if(errno==ENOMEM)
1.2331 + {
1.2332 + return 0;
1.2333 + }
1.2334 + BN_free(e);
1.2335 + if(errno==ENOMEM)
1.2336 + {
1.2337 + return 0;
1.2338 + }
1.2339 + return(1);
1.2340 + }
1.2341 +
1.2342 +int test_mod_mul(BIO *bp, BN_CTX *ctx)
1.2343 + {
1.2344 + BIGNUM *a,*b,*c,*d,*e;
1.2345 + int i,j;
1.2346 + unsigned long l;
1.2347 +
1.2348 + a=BN_new();
1.2349 + if(errno==ENOMEM)
1.2350 + {
1.2351 + return 0;
1.2352 + }
1.2353 + b=BN_new();
1.2354 + if(errno==ENOMEM)
1.2355 + {
1.2356 + return 0;
1.2357 + }
1.2358 + c=BN_new();
1.2359 + if(errno==ENOMEM)
1.2360 + {
1.2361 + return 0;
1.2362 + }
1.2363 + d=BN_new();
1.2364 + if(errno==ENOMEM)
1.2365 + {
1.2366 + return 0;
1.2367 + }
1.2368 + e=BN_new();
1.2369 + if(errno==ENOMEM)
1.2370 + {
1.2371 + return 0;
1.2372 + }
1.2373 +
1.2374 + for (j=0; j<3; j++) {
1.2375 + BN_bntest_rand(c,1024,0,0); /**/
1.2376 + if(errno==ENOMEM)
1.2377 + {
1.2378 + return 0;
1.2379 + }
1.2380 + for (i=0; i<num0; i++)
1.2381 + {
1.2382 + BN_bntest_rand(a,475+i*10,0,0); /**/
1.2383 + if(errno==ENOMEM)
1.2384 + {
1.2385 + return 0;
1.2386 + }
1.2387 + BN_bntest_rand(b,425+i*11,0,0); /**/
1.2388 + if(errno==ENOMEM)
1.2389 + {
1.2390 + return 0;
1.2391 + }
1.2392 + a->neg=rand_neg();
1.2393 + if(errno==ENOMEM)
1.2394 + {
1.2395 + return 0;
1.2396 + }
1.2397 + b->neg=rand_neg();
1.2398 + if(errno==ENOMEM)
1.2399 + {
1.2400 + return 0;
1.2401 + }
1.2402 + if (!BN_mod_mul(e,a,b,c,ctx))
1.2403 + {
1.2404 + if(errno==ENOMEM)
1.2405 + {
1.2406 + return 0;
1.2407 + }
1.2408 +
1.2409 +
1.2410 + while ((l=ERR_get_error()))
1.2411 + fprintf(stderr,"ERROR:%s\n",
1.2412 + ERR_error_string(l,NULL));
1.2413 + return 1;
1.2414 + if(errno==ENOMEM)
1.2415 + {
1.2416 + return 0;
1.2417 + }
1.2418 + }
1.2419 + if (bp != NULL)
1.2420 + {
1.2421 + if (!results)
1.2422 + {
1.2423 + BN_print(bp,a);
1.2424 + if(errno==ENOMEM)
1.2425 + {
1.2426 + return 0;
1.2427 + }
1.2428 + BIO_puts(bp," * ");
1.2429 + if(errno==ENOMEM)
1.2430 + {
1.2431 + return 0;
1.2432 + }
1.2433 + BN_print(bp,b);
1.2434 + if(errno==ENOMEM)
1.2435 + {
1.2436 + return 0;
1.2437 + }
1.2438 + BIO_puts(bp," % ");
1.2439 + if(errno==ENOMEM)
1.2440 + {
1.2441 + return 0;
1.2442 + }
1.2443 + BN_print(bp,c);
1.2444 + if(errno==ENOMEM)
1.2445 + {
1.2446 + return 0;
1.2447 + }
1.2448 + if ((a->neg ^ b->neg) && !BN_is_zero(e))
1.2449 + {
1.2450 + /* If (a*b) % c is negative, c must be added
1.2451 + * in order to obtain the normalized remainder
1.2452 + * (new with OpenSSL 0.9.7, previous versions of
1.2453 + * BN_mod_mul could generate negative results)
1.2454 + */
1.2455 + if(errno==ENOMEM)
1.2456 + {
1.2457 + return 0;
1.2458 + }
1.2459 + BIO_puts(bp," + ");
1.2460 + if(errno==ENOMEM)
1.2461 + {
1.2462 + return 0;
1.2463 + }
1.2464 + BN_print(bp,c);
1.2465 + if(errno==ENOMEM)
1.2466 + {
1.2467 + return 0;
1.2468 + }
1.2469 + }
1.2470 + BIO_puts(bp," - ");
1.2471 + if(errno==ENOMEM)
1.2472 + {
1.2473 + return 0;
1.2474 + }
1.2475 + }
1.2476 + BN_print(bp,e);
1.2477 + if(errno==ENOMEM)
1.2478 + {
1.2479 + return 0;
1.2480 + }
1.2481 + BIO_puts(bp,"\n");
1.2482 + if(errno==ENOMEM)
1.2483 + {
1.2484 + return 0;
1.2485 + }
1.2486 + }
1.2487 + BN_mul(d,a,b,ctx);
1.2488 + if(errno==ENOMEM)
1.2489 + return 0;
1.2490 + BN_sub(d,d,e);
1.2491 + if(errno==ENOMEM)
1.2492 + return 0;
1.2493 + BN_div(a,b,d,c,ctx);
1.2494 + if(errno==ENOMEM)
1.2495 + return 0;
1.2496 + if(!BN_is_zero(b))
1.2497 + {
1.2498 + if(errno==ENOMEM)
1.2499 + return 0;
1.2500 + fprintf(stderr,"Modulo multiply test failed!\n");
1.2501 + ERR_print_errors_fp(stderr);
1.2502 + if(errno==ENOMEM)
1.2503 + return 0;
1.2504 + return 0;
1.2505 + }
1.2506 + }
1.2507 + }
1.2508 + BN_free(a);
1.2509 + if(errno==ENOMEM)
1.2510 + return 0;
1.2511 + BN_free(b);
1.2512 + if(errno==ENOMEM)
1.2513 + return 0;
1.2514 + BN_free(c);
1.2515 + if(errno==ENOMEM)
1.2516 + return 0;
1.2517 + BN_free(d);
1.2518 + if(errno==ENOMEM)
1.2519 + return 0;
1.2520 + BN_free(e);
1.2521 + if(errno==ENOMEM)
1.2522 + return 0;
1.2523 + return(1);
1.2524 + }
1.2525 +
1.2526 +int test_mod_exp(BIO *bp, BN_CTX *ctx)
1.2527 + {
1.2528 + BIGNUM *a,*b,*c,*d,*e;
1.2529 + int i;
1.2530 +
1.2531 + a=BN_new();
1.2532 + if(errno==ENOMEM)
1.2533 + return 0;
1.2534 + b=BN_new();
1.2535 + if(errno==ENOMEM)
1.2536 + return 0;
1.2537 + c=BN_new();
1.2538 + if(errno==ENOMEM)
1.2539 + return 0;
1.2540 + d=BN_new();
1.2541 + if(errno==ENOMEM)
1.2542 + return 0;
1.2543 + e=BN_new();
1.2544 + if(errno==ENOMEM)
1.2545 + return 0;
1.2546 +
1.2547 + BN_bntest_rand(c,30,0,1); /* must be odd for montgomery */
1.2548 + if(errno==ENOMEM)
1.2549 + return 0;
1.2550 + for (i=0; i<num2; i++)
1.2551 + {
1.2552 + BN_bntest_rand(a,20+i*5,0,0); /**/
1.2553 + if(errno==ENOMEM)
1.2554 + return 0;
1.2555 + BN_bntest_rand(b,2+i,0,0); /**/
1.2556 + if(errno==ENOMEM)
1.2557 + return 0;
1.2558 +
1.2559 + if (!BN_mod_exp(d,a,b,c,ctx))
1.2560 + {
1.2561 + if(errno==ENOMEM)
1.2562 + return 0;
1.2563 + return(00);
1.2564 + }
1.2565 +
1.2566 + if (bp != NULL)
1.2567 + {
1.2568 + if (!results)
1.2569 + {
1.2570 + BN_print(bp,a);
1.2571 + if(errno==ENOMEM)
1.2572 + return 0;
1.2573 + BIO_puts(bp," ^ ");
1.2574 + if(errno==ENOMEM)
1.2575 + return 0;
1.2576 + BN_print(bp,b);
1.2577 + if(errno==ENOMEM)
1.2578 + return 0;
1.2579 + BIO_puts(bp," % ");
1.2580 + if(errno==ENOMEM)
1.2581 + return 0;
1.2582 + BN_print(bp,c);
1.2583 + if(errno==ENOMEM)
1.2584 + return 0;
1.2585 + BIO_puts(bp," - ");
1.2586 + if(errno==ENOMEM)
1.2587 + return 0;
1.2588 + }
1.2589 + BN_print(bp,d);
1.2590 + if(errno==ENOMEM)
1.2591 + return 0;
1.2592 + BIO_puts(bp,"\n");
1.2593 + if(errno==ENOMEM)
1.2594 + return 0;
1.2595 + }
1.2596 + BN_exp(e,a,b,ctx);
1.2597 + if(errno==ENOMEM)
1.2598 + return 0;
1.2599 + BN_sub(e,e,d);
1.2600 + if(errno==ENOMEM)
1.2601 + return 0;
1.2602 + BN_div(a,b,e,c,ctx);
1.2603 + if(errno==ENOMEM)
1.2604 + return 0;
1.2605 + if(!BN_is_zero(b))
1.2606 + {
1.2607 + if(errno==ENOMEM)
1.2608 + return 0;
1.2609 + fprintf(stderr,"Modulo exponentiation test failed!\n");
1.2610 + return 0;
1.2611 + }
1.2612 + }
1.2613 + BN_free(a);
1.2614 + if(errno==ENOMEM)
1.2615 + return 0;
1.2616 + BN_free(b);
1.2617 + if(errno==ENOMEM)
1.2618 + return 0;
1.2619 + BN_free(c);
1.2620 + if(errno==ENOMEM)
1.2621 + return 0;
1.2622 + BN_free(d);
1.2623 + if(errno==ENOMEM)
1.2624 + return 0;
1.2625 + BN_free(e);
1.2626 + if(errno==ENOMEM)
1.2627 + return 0;
1.2628 + return(1);
1.2629 + }
1.2630 +
1.2631 +int test_mod_exp_mont_consttime(BIO *bp, BN_CTX *ctx)
1.2632 + {
1.2633 + BIGNUM *a,*b,*c,*d,*e;
1.2634 + int i;
1.2635 +
1.2636 + a=BN_new();
1.2637 + if(errno==ENOMEM)
1.2638 + return 0;
1.2639 + b=BN_new();
1.2640 + if(errno==ENOMEM)
1.2641 + return 0;
1.2642 + c=BN_new();
1.2643 + if(errno==ENOMEM)
1.2644 + return 0;
1.2645 + d=BN_new();
1.2646 + if(errno==ENOMEM)
1.2647 + return 0;
1.2648 + e=BN_new();
1.2649 + if(errno==ENOMEM)
1.2650 + return 0;
1.2651 +
1.2652 + BN_bntest_rand(c,30,0,1); /* must be odd for montgomery */
1.2653 + if(errno==ENOMEM)
1.2654 + return 0;
1.2655 + for (i=0; i<num2; i++)
1.2656 + {
1.2657 + BN_bntest_rand(a,20+i*5,0,0); /**/
1.2658 + if(errno==ENOMEM)
1.2659 + return 0;
1.2660 + BN_bntest_rand(b,2+i,0,0); /**/
1.2661 + if(errno==ENOMEM)
1.2662 + return 0;
1.2663 +
1.2664 + if (!BN_mod_exp_mont_consttime(d,a,b,c,ctx,NULL))
1.2665 + {
1.2666 +
1.2667 + if(errno==ENOMEM)
1.2668 + return 0;
1.2669 + return(00);
1.2670 + }
1.2671 + if (bp != NULL)
1.2672 + {
1.2673 + if (!results)
1.2674 + {
1.2675 + BN_print(bp,a);
1.2676 + if(errno==ENOMEM)
1.2677 + return 0;
1.2678 + BIO_puts(bp," ^ ");
1.2679 + if(errno==ENOMEM)
1.2680 + return 0;
1.2681 + BN_print(bp,b);
1.2682 + if(errno==ENOMEM)
1.2683 + return 0;
1.2684 + BIO_puts(bp," % ");
1.2685 + if(errno==ENOMEM)
1.2686 + return 0;
1.2687 + BN_print(bp,c);
1.2688 + if(errno==ENOMEM)
1.2689 + return 0;
1.2690 + BIO_puts(bp," - ");
1.2691 + if(errno==ENOMEM)
1.2692 + return 0;
1.2693 + }
1.2694 + BN_print(bp,d);
1.2695 + if(errno==ENOMEM)
1.2696 + return 0;
1.2697 + BIO_puts(bp,"\n");
1.2698 + if(errno==ENOMEM)
1.2699 + return 0;
1.2700 + }
1.2701 + BN_exp(e,a,b,ctx);
1.2702 + if(errno==ENOMEM)
1.2703 + return 0;
1.2704 + BN_sub(e,e,d);
1.2705 + if(errno==ENOMEM)
1.2706 + return 0;
1.2707 + BN_div(a,b,e,c,ctx);
1.2708 + if(errno==ENOMEM)
1.2709 + return 0;
1.2710 + if(!BN_is_zero(b))
1.2711 + {
1.2712 +
1.2713 + if(errno==ENOMEM)
1.2714 + return 0;
1.2715 + fprintf(stderr,"Modulo exponentiation test failed!\n");
1.2716 + return 0;
1.2717 + }
1.2718 + }
1.2719 + BN_free(a);
1.2720 + if(errno==ENOMEM)
1.2721 + return 0;
1.2722 + BN_free(b);
1.2723 + if(errno==ENOMEM)
1.2724 + return 0;
1.2725 + BN_free(c);
1.2726 + if(errno==ENOMEM)
1.2727 + return 0;
1.2728 + BN_free(d);
1.2729 + if(errno==ENOMEM)
1.2730 + return 0;
1.2731 + BN_free(e);
1.2732 + if(errno==ENOMEM)
1.2733 + return 0;
1.2734 + return(1);
1.2735 + }
1.2736 +
1.2737 +int test_exp(BIO *bp, BN_CTX *ctx)
1.2738 + {
1.2739 + BIGNUM *a,*b,*d,*e,*one;
1.2740 + int i;
1.2741 +
1.2742 + a=BN_new();
1.2743 + if(errno==ENOMEM)
1.2744 + return 0;
1.2745 + b=BN_new();
1.2746 + if(errno==ENOMEM)
1.2747 + return 0;
1.2748 + d=BN_new();
1.2749 + if(errno==ENOMEM)
1.2750 + return 0;
1.2751 + e=BN_new();
1.2752 + if(errno==ENOMEM)
1.2753 + return 0;
1.2754 + one=BN_new();
1.2755 + if(errno==ENOMEM)
1.2756 + return 0;
1.2757 + BN_one(one);
1.2758 + if(errno==ENOMEM)
1.2759 + return 0;
1.2760 +
1.2761 + for (i=0; i<num2; i++)
1.2762 + {
1.2763 + BN_bntest_rand(a,20+i*5,0,0); /**/
1.2764 + if(errno==ENOMEM)
1.2765 + return 0;
1.2766 + BN_bntest_rand(b,2+i,0,0); /**/
1.2767 + if(errno==ENOMEM)
1.2768 + return 0;
1.2769 +
1.2770 + if (!BN_exp(d,a,b,ctx))
1.2771 + {
1.2772 +
1.2773 + if(errno==ENOMEM)
1.2774 + return 0;
1.2775 + return(00);
1.2776 + }
1.2777 + if (bp != NULL)
1.2778 + {
1.2779 + if (!results)
1.2780 + {
1.2781 + BN_print(bp,a);
1.2782 + if(errno==ENOMEM)
1.2783 + return 0;
1.2784 + BIO_puts(bp," ^ ");
1.2785 + if(errno==ENOMEM)
1.2786 + return 0;
1.2787 + BN_print(bp,b);
1.2788 + if(errno==ENOMEM)
1.2789 + return 0;
1.2790 + BIO_puts(bp," - ");
1.2791 + if(errno==ENOMEM)
1.2792 + return 0;
1.2793 + }
1.2794 + BN_print(bp,d);
1.2795 + if(errno==ENOMEM)
1.2796 + return 0;
1.2797 + BIO_puts(bp,"\n");
1.2798 + if(errno==ENOMEM)
1.2799 + return 0;
1.2800 + }
1.2801 + BN_one(e);
1.2802 + if(errno==ENOMEM)
1.2803 + return 0;
1.2804 + for( ; !BN_is_zero(b) ; BN_sub(b,b,one))
1.2805 + {
1.2806 + if(errno==ENOMEM)
1.2807 + return 0;
1.2808 + BN_mul(e,e,a,ctx);
1.2809 + if(errno==ENOMEM)
1.2810 + return 0;
1.2811 + }
1.2812 + BN_sub(e,e,d);
1.2813 + if(errno==ENOMEM)
1.2814 + return 0;
1.2815 + if(!BN_is_zero(e))
1.2816 + {
1.2817 + if(errno==ENOMEM)
1.2818 + return 0;
1.2819 + fprintf(stderr,"Exponentiation test failed!\n");
1.2820 + return 0;
1.2821 + }
1.2822 + }
1.2823 + BN_free(a);
1.2824 + if(errno==ENOMEM)
1.2825 + return 0;
1.2826 + BN_free(b);
1.2827 + if(errno==ENOMEM)
1.2828 + return 0;
1.2829 + BN_free(d);
1.2830 + if(errno==ENOMEM)
1.2831 + return 0;
1.2832 + BN_free(e);
1.2833 + if(errno==ENOMEM)
1.2834 + return 0;
1.2835 + BN_free(one);
1.2836 + if(errno==ENOMEM)
1.2837 + return 0;
1.2838 + return(1);
1.2839 + }
1.2840 +
1.2841 +int test_gf2m_add(BIO *bp)
1.2842 + {
1.2843 + BIGNUM a,b,c;
1.2844 + int i, ret = 0;
1.2845 +
1.2846 + BN_init(&a);
1.2847 + if(errno==ENOMEM)
1.2848 + return 0;
1.2849 + BN_init(&b);
1.2850 + if(errno==ENOMEM)
1.2851 + return 0;
1.2852 + BN_init(&c);
1.2853 + if(errno==ENOMEM)
1.2854 + return 0;
1.2855 +
1.2856 + for (i=0; i<num0; i++)
1.2857 + {
1.2858 + BN_rand(&a,512,0,0);
1.2859 + if(errno==ENOMEM)
1.2860 + return 0;
1.2861 + BN_copy(&b, BN_value_one());
1.2862 + if(errno==ENOMEM)
1.2863 + return 0;
1.2864 + a.neg=rand_neg();
1.2865 + if(errno==ENOMEM)
1.2866 + return 0;
1.2867 + b.neg=rand_neg();
1.2868 + if(errno==ENOMEM)
1.2869 + return 0;
1.2870 + BN_GF2m_add(&c,&a,&b);
1.2871 + if(errno==ENOMEM)
1.2872 + return 0;
1.2873 +#if 0 /* make test uses ouput in bc but bc can't handle GF(2^m) arithmetic */
1.2874 + if (bp != NULL)
1.2875 + {
1.2876 + if (!results)
1.2877 + {
1.2878 + BN_print(bp,&a);
1.2879 + if(errno==ENOMEM)
1.2880 + return 0;
1.2881 + BIO_puts(bp," ^ ");
1.2882 + if(errno==ENOMEM)
1.2883 + return 0;
1.2884 + BN_print(bp,&b);
1.2885 + if(errno==ENOMEM)
1.2886 + return 0;
1.2887 + BIO_puts(bp," = ");
1.2888 + if(errno==ENOMEM)
1.2889 + return 0;
1.2890 + }
1.2891 + BN_print(bp,&c);
1.2892 + if(errno==ENOMEM)
1.2893 + return 0;
1.2894 + BIO_puts(bp,"\n");
1.2895 + if(errno==ENOMEM)
1.2896 + return 0;
1.2897 + }
1.2898 +#endif
1.2899 + /* Test that two added values have the correct parity. */
1.2900 + if((BN_is_odd(&a) && BN_is_odd(&c)) || (!BN_is_odd(&a) && !BN_is_odd(&c)))
1.2901 + {
1.2902 +
1.2903 + if(errno==ENOMEM)
1.2904 + return 0;
1.2905 + fprintf(stderr,"GF(2^m) addition test (a) failed!\n");
1.2906 + goto err;
1.2907 + }
1.2908 + BN_GF2m_add(&c,&c,&c);
1.2909 + if(errno==ENOMEM)
1.2910 + return 0;
1.2911 + /* Test that c + c = 0. */
1.2912 + if(!BN_is_zero(&c))
1.2913 + {
1.2914 +
1.2915 + if(errno==ENOMEM)
1.2916 + return 0;
1.2917 + fprintf(stderr,"GF(2^m) addition test (b) failed!\n");
1.2918 + goto err;
1.2919 + }
1.2920 + }
1.2921 + ret = 1;
1.2922 + err:
1.2923 + BN_free(&a);
1.2924 + if(errno==ENOMEM)
1.2925 + return 0;
1.2926 + BN_free(&b);
1.2927 + if(errno==ENOMEM)
1.2928 + return 0;
1.2929 + BN_free(&c);
1.2930 + if(errno==ENOMEM)
1.2931 + return 0;
1.2932 + return ret;
1.2933 + }
1.2934 +
1.2935 +int test_gf2m_mod(BIO *bp)
1.2936 + {
1.2937 + BIGNUM *a,*b[2],*c,*d,*e;
1.2938 + int i, j, ret = 0;
1.2939 + unsigned int p0[] = {163,7,6,3,0};
1.2940 + unsigned int p1[] = {193,15,0};
1.2941 +
1.2942 + a=BN_new();
1.2943 + if(errno==ENOMEM)
1.2944 + return 0;
1.2945 + b[0]=BN_new();
1.2946 + if(errno==ENOMEM)
1.2947 + return 0;
1.2948 + b[1]=BN_new();
1.2949 + if(errno==ENOMEM)
1.2950 + return 0;
1.2951 + c=BN_new();
1.2952 + if(errno==ENOMEM)
1.2953 + return 0;
1.2954 + d=BN_new();
1.2955 + if(errno==ENOMEM)
1.2956 + return 0;
1.2957 + e=BN_new();
1.2958 + if(errno==ENOMEM)
1.2959 + return 0;
1.2960 +
1.2961 + BN_GF2m_arr2poly(p0, b[0]);
1.2962 + if(errno==ENOMEM)
1.2963 + return 0;
1.2964 + BN_GF2m_arr2poly(p1, b[1]);
1.2965 + if(errno==ENOMEM)
1.2966 + return 0;
1.2967 +
1.2968 + for (i=0; i<num0; i++)
1.2969 + {
1.2970 + BN_bntest_rand(a, 1024, 0, 0);
1.2971 + if(errno==ENOMEM)
1.2972 + return 0;
1.2973 + for (j=0; j < 2; j++)
1.2974 + {
1.2975 + BN_GF2m_mod(c, a, b[j]);
1.2976 + if(errno==ENOMEM)
1.2977 + return 0;
1.2978 +#if 0 /* make test uses ouput in bc but bc can't handle GF(2^m) arithmetic */
1.2979 + if (bp != NULL)
1.2980 + {
1.2981 + if (!results)
1.2982 + {
1.2983 + BN_print(bp,a);
1.2984 + if(errno==ENOMEM)
1.2985 + return 0;
1.2986 + BIO_puts(bp," % ");
1.2987 + if(errno==ENOMEM)
1.2988 + return 0;
1.2989 + BN_print(bp,b[j]);
1.2990 + if(errno==ENOMEM)
1.2991 + return 0;
1.2992 + BIO_puts(bp," - ");
1.2993 + if(errno==ENOMEM)
1.2994 + return 0;
1.2995 + BN_print(bp,c);
1.2996 + if(errno==ENOMEM)
1.2997 + return 0;
1.2998 + BIO_puts(bp,"\n");
1.2999 + if(errno==ENOMEM)
1.3000 + return 0;
1.3001 + }
1.3002 + }
1.3003 +#endif
1.3004 + BN_GF2m_add(d, a, c);
1.3005 + if(errno==ENOMEM)
1.3006 + return 0;
1.3007 + BN_GF2m_mod(e, d, b[j]);
1.3008 + if(errno==ENOMEM)
1.3009 + return 0;
1.3010 + /* Test that a + (a mod p) mod p == 0. */
1.3011 + if(!BN_is_zero(e))
1.3012 + {
1.3013 + if(errno==ENOMEM)
1.3014 + return 0;
1.3015 + fprintf(stderr,"GF(2^m) modulo test failed!\n");
1.3016 + goto err;
1.3017 + }
1.3018 + }
1.3019 + }
1.3020 + ret = 1;
1.3021 + err:
1.3022 + BN_free(a);
1.3023 + if(errno==ENOMEM)
1.3024 + return 0;
1.3025 + BN_free(b[0]);
1.3026 + if(errno==ENOMEM)
1.3027 + return 0;
1.3028 + BN_free(b[1]);
1.3029 + if(errno==ENOMEM)
1.3030 + return 0;
1.3031 + BN_free(c);
1.3032 + if(errno==ENOMEM)
1.3033 + return 0;
1.3034 + BN_free(d);
1.3035 + if(errno==ENOMEM)
1.3036 + return 0;
1.3037 + BN_free(e);
1.3038 + if(errno==ENOMEM)
1.3039 + return 0;
1.3040 + return ret;
1.3041 + }
1.3042 +
1.3043 +int test_gf2m_mod_mul(BIO *bp,BN_CTX *ctx)
1.3044 + {
1.3045 + BIGNUM *a,*b[2],*c,*d,*e,*f,*g,*h;
1.3046 + int i, j, ret = 0;
1.3047 + unsigned int p0[] = {163,7,6,3,0};
1.3048 + unsigned int p1[] = {193,15,0};
1.3049 +
1.3050 + a=BN_new();
1.3051 + if(errno==ENOMEM)
1.3052 + return 0;
1.3053 + b[0]=BN_new();
1.3054 + if(errno==ENOMEM)
1.3055 + return 0;
1.3056 + b[1]=BN_new();
1.3057 + if(errno==ENOMEM)
1.3058 + return 0;
1.3059 + c=BN_new();
1.3060 + if(errno==ENOMEM)
1.3061 + return 0;
1.3062 + d=BN_new();
1.3063 + if(errno==ENOMEM)
1.3064 + return 0;
1.3065 + e=BN_new();
1.3066 + if(errno==ENOMEM)
1.3067 + return 0;
1.3068 + f=BN_new();
1.3069 + if(errno==ENOMEM)
1.3070 + return 0;
1.3071 + g=BN_new();
1.3072 + if(errno==ENOMEM)
1.3073 + return 0;
1.3074 + h=BN_new();
1.3075 + if(errno==ENOMEM)
1.3076 + return 0;
1.3077 +
1.3078 + BN_GF2m_arr2poly(p0, b[0]);
1.3079 + if(errno==ENOMEM)
1.3080 + return 0;
1.3081 + BN_GF2m_arr2poly(p1, b[1]);
1.3082 + if(errno==ENOMEM)
1.3083 + return 0;
1.3084 +
1.3085 + for (i=0; i<num0; i++)
1.3086 + {
1.3087 + BN_bntest_rand(a, 1024, 0, 0);
1.3088 + if(errno==ENOMEM)
1.3089 + return 0;
1.3090 + BN_bntest_rand(c, 1024, 0, 0);
1.3091 + if(errno==ENOMEM)
1.3092 + return 0;
1.3093 + BN_bntest_rand(d, 1024, 0, 0);
1.3094 + if(errno==ENOMEM)
1.3095 + return 0;
1.3096 + for (j=0; j < 2; j++)
1.3097 + {
1.3098 + BN_GF2m_mod_mul(e, a, c, b[j], ctx);
1.3099 + if(errno==ENOMEM)
1.3100 + return 0;
1.3101 +#if 0 /* make test uses ouput in bc but bc can't handle GF(2^m) arithmetic */
1.3102 + if (bp != NULL)
1.3103 + {
1.3104 + if (!results)
1.3105 + {
1.3106 + BN_print(bp,a);
1.3107 + if(errno==ENOMEM)
1.3108 + return 0;
1.3109 + BIO_puts(bp," * ");
1.3110 + if(errno==ENOMEM)
1.3111 + return 0;
1.3112 + BN_print(bp,c);
1.3113 + if(errno==ENOMEM)
1.3114 + return 0;
1.3115 + BIO_puts(bp," % ");
1.3116 + if(errno==ENOMEM)
1.3117 + return 0;
1.3118 + BN_print(bp,b[j]);
1.3119 + if(errno==ENOMEM)
1.3120 + return 0;
1.3121 + BIO_puts(bp," - ");
1.3122 + if(errno==ENOMEM)
1.3123 + return 0;
1.3124 + BN_print(bp,e);
1.3125 + if(errno==ENOMEM)
1.3126 + return 0;
1.3127 + BIO_puts(bp,"\n");
1.3128 + if(errno==ENOMEM)
1.3129 + return 0;
1.3130 + }
1.3131 + }
1.3132 +#endif
1.3133 + BN_GF2m_add(f, a, d);
1.3134 + if(errno==ENOMEM)
1.3135 + return 0;
1.3136 + BN_GF2m_mod_mul(g, f, c, b[j], ctx);
1.3137 + if(errno==ENOMEM)
1.3138 + return 0;
1.3139 + BN_GF2m_mod_mul(h, d, c, b[j], ctx);
1.3140 + if(errno==ENOMEM)
1.3141 + return 0;
1.3142 + BN_GF2m_add(f, e, g);
1.3143 + if(errno==ENOMEM)
1.3144 + return 0;
1.3145 + BN_GF2m_add(f, f, h);
1.3146 + if(errno==ENOMEM)
1.3147 + return 0;
1.3148 + /* Test that (a+d)*c = a*c + d*c. */
1.3149 + if(!BN_is_zero(f))
1.3150 + {
1.3151 +
1.3152 + if(errno==ENOMEM)
1.3153 + return 0;
1.3154 + fprintf(stderr,"GF(2^m) modular multiplication test failed!\n");
1.3155 + goto err;
1.3156 + }
1.3157 + }
1.3158 + }
1.3159 + ret = 1;
1.3160 + err:
1.3161 + BN_free(a);
1.3162 + if(errno==ENOMEM)
1.3163 + return 0;
1.3164 + BN_free(b[0]);
1.3165 + if(errno==ENOMEM)
1.3166 + return 0;
1.3167 + BN_free(b[1]);
1.3168 + if(errno==ENOMEM)
1.3169 + return 0;
1.3170 + BN_free(c);
1.3171 + if(errno==ENOMEM)
1.3172 + return 0;
1.3173 + BN_free(d);
1.3174 + if(errno==ENOMEM)
1.3175 + return 0;
1.3176 + BN_free(e);
1.3177 + if(errno==ENOMEM)
1.3178 + return 0;
1.3179 + BN_free(f);
1.3180 + if(errno==ENOMEM)
1.3181 + return 0;
1.3182 + BN_free(g);
1.3183 + if(errno==ENOMEM)
1.3184 + return 0;
1.3185 + BN_free(h);
1.3186 + if(errno==ENOMEM)
1.3187 + return 0;
1.3188 + return ret;
1.3189 + }
1.3190 +
1.3191 +int test_gf2m_mod_sqr(BIO *bp,BN_CTX *ctx)
1.3192 + {
1.3193 + BIGNUM *a,*b[2],*c,*d;
1.3194 + int i, j, ret = 0;
1.3195 + unsigned int p0[] = {163,7,6,3,0};
1.3196 + unsigned int p1[] = {193,15,0};
1.3197 +
1.3198 + a=BN_new();
1.3199 + if(errno==ENOMEM)
1.3200 + return 0;
1.3201 + b[0]=BN_new();
1.3202 + if(errno==ENOMEM)
1.3203 + return 0;
1.3204 + b[1]=BN_new();
1.3205 + if(errno==ENOMEM)
1.3206 + return 0;
1.3207 + c=BN_new();
1.3208 + if(errno==ENOMEM)
1.3209 + return 0;
1.3210 + d=BN_new();
1.3211 + if(errno==ENOMEM)
1.3212 + return 0;
1.3213 +
1.3214 + BN_GF2m_arr2poly(p0, b[0]);
1.3215 + if(errno==ENOMEM)
1.3216 + return 0;
1.3217 + BN_GF2m_arr2poly(p1, b[1]);
1.3218 + if(errno==ENOMEM)
1.3219 + return 0;
1.3220 +
1.3221 + for (i=0; i<num0; i++)
1.3222 + {
1.3223 + BN_bntest_rand(a, 1024, 0, 0);
1.3224 + if(errno==ENOMEM)
1.3225 + return 0;
1.3226 + for (j=0; j < 2; j++)
1.3227 + {
1.3228 + BN_GF2m_mod_sqr(c, a, b[j], ctx);
1.3229 + if(errno==ENOMEM)
1.3230 + return 0;
1.3231 + BN_copy(d, a);
1.3232 + if(errno==ENOMEM)
1.3233 + return 0;
1.3234 + BN_GF2m_mod_mul(d, a, d, b[j], ctx);
1.3235 + if(errno==ENOMEM)
1.3236 + return 0;
1.3237 +#if 0 /* make test uses ouput in bc but bc can't handle GF(2^m) arithmetic */
1.3238 + if (bp != NULL)
1.3239 + {
1.3240 + if (!results)
1.3241 + {
1.3242 + BN_print(bp,a);
1.3243 + if(errno==ENOMEM)
1.3244 + return 0;
1.3245 + BIO_puts(bp," ^ 2 % ");
1.3246 + if(errno==ENOMEM)
1.3247 + return 0;
1.3248 + BN_print(bp,b[j]);
1.3249 + if(errno==ENOMEM)
1.3250 + return 0;
1.3251 + BIO_puts(bp, " = ");
1.3252 + if(errno==ENOMEM)
1.3253 + return 0;
1.3254 + BN_print(bp,c);
1.3255 + if(errno==ENOMEM)
1.3256 + return 0;
1.3257 + BIO_puts(bp,"; a * a = ");
1.3258 + if(errno==ENOMEM)
1.3259 + return 0;
1.3260 + BN_print(bp,d);
1.3261 + if(errno==ENOMEM)
1.3262 + return 0;
1.3263 + BIO_puts(bp,"\n");
1.3264 + if(errno==ENOMEM)
1.3265 + return 0;
1.3266 + }
1.3267 + }
1.3268 +#endif
1.3269 + BN_GF2m_add(d, c, d);
1.3270 + if(errno==ENOMEM)
1.3271 + return 0;
1.3272 + /* Test that a*a = a^2. */
1.3273 + if(!BN_is_zero(d))
1.3274 + {
1.3275 + if(errno==ENOMEM)
1.3276 + return 0;
1.3277 + fprintf(stderr,"GF(2^m) modular squaring test failed!\n");
1.3278 + goto err;
1.3279 + }
1.3280 + }
1.3281 + }
1.3282 + ret = 1;
1.3283 + err:
1.3284 + BN_free(a);
1.3285 + if(errno==ENOMEM)
1.3286 + return 0;
1.3287 + BN_free(b[0]);
1.3288 + if(errno==ENOMEM)
1.3289 + return 0;
1.3290 + BN_free(b[1]);
1.3291 + if(errno==ENOMEM)
1.3292 + return 0;
1.3293 + BN_free(c);
1.3294 + if(errno==ENOMEM)
1.3295 + return 0;
1.3296 + BN_free(d);
1.3297 + if(errno==ENOMEM)
1.3298 + return 0;
1.3299 + return ret;
1.3300 + }
1.3301 +
1.3302 +int test_gf2m_mod_inv(BIO *bp,BN_CTX *ctx)
1.3303 + {
1.3304 + BIGNUM *a,*b[2],*c,*d;
1.3305 + int i, j, ret = 0;
1.3306 + unsigned int p0[] = {163,7,6,3,0};
1.3307 + unsigned int p1[] = {193,15,0};
1.3308 +
1.3309 + a=BN_new();
1.3310 + if(errno==ENOMEM)
1.3311 + return 0;
1.3312 + b[0]=BN_new();
1.3313 + if(errno==ENOMEM)
1.3314 + return 0;
1.3315 + b[1]=BN_new();
1.3316 + if(errno==ENOMEM)
1.3317 + return 0;
1.3318 + c=BN_new();
1.3319 + if(errno==ENOMEM)
1.3320 + return 0;
1.3321 + d=BN_new();
1.3322 + if(errno==ENOMEM)
1.3323 + return 0;
1.3324 +
1.3325 + BN_GF2m_arr2poly(p0, b[0]);
1.3326 + if(errno==ENOMEM)
1.3327 + return 0;
1.3328 + BN_GF2m_arr2poly(p1, b[1]);
1.3329 + if(errno==ENOMEM)
1.3330 + return 0;
1.3331 +
1.3332 + for (i=0; i<num0; i++)
1.3333 + {
1.3334 + BN_bntest_rand(a, 512, 0, 0);
1.3335 + for (j=0; j < 2; j++)
1.3336 + {
1.3337 + BN_GF2m_mod_inv(c, a, b[j], ctx);
1.3338 + if(errno==ENOMEM)
1.3339 + return 0;
1.3340 + BN_GF2m_mod_mul(d, a, c, b[j], ctx);
1.3341 + if(errno==ENOMEM)
1.3342 + return 0;
1.3343 +#if 0 /* make test uses ouput in bc but bc can't handle GF(2^m) arithmetic */
1.3344 + if (bp != NULL)
1.3345 + {
1.3346 + if (!results)
1.3347 + {
1.3348 + BN_print(bp,a);
1.3349 + if(errno==ENOMEM)
1.3350 + return 0;
1.3351 + BIO_puts(bp, " * ");
1.3352 + if(errno==ENOMEM)
1.3353 + return 0;
1.3354 + BN_print(bp,c);
1.3355 + if(errno==ENOMEM)
1.3356 + return 0;
1.3357 + BIO_puts(bp," - 1 % ");
1.3358 + if(errno==ENOMEM)
1.3359 + return 0;
1.3360 + BN_print(bp,b[j]);
1.3361 + if(errno==ENOMEM)
1.3362 + return 0;
1.3363 + BIO_puts(bp,"\n");
1.3364 + if(errno==ENOMEM)
1.3365 + return 0;
1.3366 + }
1.3367 + }
1.3368 +#endif
1.3369 + /* Test that ((1/a)*a) = 1. */
1.3370 + if(!BN_is_one(d))
1.3371 + {
1.3372 + if(errno==ENOMEM)
1.3373 + return 0;
1.3374 + fprintf(stderr,"GF(2^m) modular inversion test failed!\n");
1.3375 + goto err;
1.3376 + }
1.3377 + }
1.3378 + }
1.3379 + ret = 1;
1.3380 + err:
1.3381 + BN_free(a);
1.3382 + if(errno==ENOMEM)
1.3383 + return 0;
1.3384 + BN_free(b[0]);
1.3385 + if(errno==ENOMEM)
1.3386 + return 0;
1.3387 + BN_free(b[1]);
1.3388 + if(errno==ENOMEM)
1.3389 + return 0;
1.3390 + BN_free(c);
1.3391 + if(errno==ENOMEM)
1.3392 + return 0;
1.3393 + BN_free(d);
1.3394 + if(errno==ENOMEM)
1.3395 + return 0;
1.3396 + return ret;
1.3397 + }
1.3398 +
1.3399 +int test_gf2m_mod_div(BIO *bp,BN_CTX *ctx)
1.3400 + {
1.3401 + BIGNUM *a,*b[2],*c,*d,*e,*f;
1.3402 + int i, j, ret = 0;
1.3403 + unsigned int p0[] = {163,7,6,3,0};
1.3404 + unsigned int p1[] = {193,15,0};
1.3405 +
1.3406 + a=BN_new();
1.3407 + if(errno==ENOMEM)
1.3408 + return 0;
1.3409 + b[0]=BN_new();
1.3410 + if(errno==ENOMEM)
1.3411 + return 0;
1.3412 + b[1]=BN_new();
1.3413 + if(errno==ENOMEM)
1.3414 + return 0;
1.3415 + c=BN_new();
1.3416 + if(errno==ENOMEM)
1.3417 + return 0;
1.3418 + d=BN_new();
1.3419 + if(errno==ENOMEM)
1.3420 + return 0;
1.3421 + e=BN_new();
1.3422 + if(errno==ENOMEM)
1.3423 + return 0;
1.3424 + f=BN_new();
1.3425 + if(errno==ENOMEM)
1.3426 + return 0;
1.3427 +
1.3428 + BN_GF2m_arr2poly(p0, b[0]);
1.3429 + if(errno==ENOMEM)
1.3430 + return 0;
1.3431 + BN_GF2m_arr2poly(p1, b[1]);
1.3432 + if(errno==ENOMEM)
1.3433 + return 0;
1.3434 +
1.3435 + for (i=0; i<num0; i++)
1.3436 + {
1.3437 + BN_bntest_rand(a, 512, 0, 0);
1.3438 + if(errno==ENOMEM)
1.3439 + return 0;
1.3440 + BN_bntest_rand(c, 512, 0, 0);
1.3441 + if(errno==ENOMEM)
1.3442 + return 0;
1.3443 + for (j=0; j < 2; j++)
1.3444 + {
1.3445 + BN_GF2m_mod_div(d, a, c, b[j], ctx);
1.3446 + if(errno==ENOMEM)
1.3447 + return 0;
1.3448 + BN_GF2m_mod_mul(e, d, c, b[j], ctx);
1.3449 + if(errno==ENOMEM)
1.3450 + return 0;
1.3451 + BN_GF2m_mod_div(f, a, e, b[j], ctx);
1.3452 + if(errno==ENOMEM)
1.3453 + return 0;
1.3454 +#if 0 /* make test uses ouput in bc but bc can't handle GF(2^m) arithmetic */
1.3455 + if (bp != NULL)
1.3456 + {
1.3457 + if (!results)
1.3458 + {
1.3459 + BN_print(bp,a);
1.3460 + if(errno==ENOMEM)
1.3461 + return 0;
1.3462 + BIO_puts(bp, " = ");
1.3463 + if(errno==ENOMEM)
1.3464 + return 0;
1.3465 + BN_print(bp,c);
1.3466 + if(errno==ENOMEM)
1.3467 + return 0;
1.3468 + BIO_puts(bp," * ");
1.3469 + if(errno==ENOMEM)
1.3470 + return 0;
1.3471 + BN_print(bp,d);
1.3472 + BIO_puts(bp, " % ");
1.3473 + if(errno==ENOMEM)
1.3474 + return 0;
1.3475 + BN_print(bp,b[j]);
1.3476 + if(errno==ENOMEM)
1.3477 + return 0;
1.3478 + BIO_puts(bp,"\n");
1.3479 + if(errno==ENOMEM)
1.3480 + return 0;
1.3481 + }
1.3482 + }
1.3483 +#endif
1.3484 + /* Test that ((a/c)*c)/a = 1. */
1.3485 + if(!BN_is_one(f))
1.3486 + {
1.3487 +
1.3488 + if(errno==ENOMEM)
1.3489 + return 0;
1.3490 + fprintf(stderr,"GF(2^m) modular division test failed!\n");
1.3491 + goto err;
1.3492 + }
1.3493 + }
1.3494 + }
1.3495 + ret = 1;
1.3496 + err:
1.3497 + BN_free(a);
1.3498 + if(errno==ENOMEM)
1.3499 + return 0;
1.3500 + BN_free(b[0]);
1.3501 + if(errno==ENOMEM)
1.3502 + return 0;
1.3503 + BN_free(b[1]);
1.3504 + if(errno==ENOMEM)
1.3505 + return 0;
1.3506 + BN_free(c);
1.3507 + if(errno==ENOMEM)
1.3508 + return 0;
1.3509 + BN_free(d);
1.3510 + if(errno==ENOMEM)
1.3511 + return 0;
1.3512 + BN_free(e);
1.3513 + if(errno==ENOMEM)
1.3514 + return 0;
1.3515 + BN_free(f);
1.3516 + if(errno==ENOMEM)
1.3517 + return 0;
1.3518 + return ret;
1.3519 + }
1.3520 +
1.3521 +int test_gf2m_mod_exp(BIO *bp,BN_CTX *ctx)
1.3522 + {
1.3523 + BIGNUM *a,*b[2],*c,*d,*e,*f;
1.3524 + int i, j, ret = 0;
1.3525 + unsigned int p0[] = {163,7,6,3,0};
1.3526 + unsigned int p1[] = {193,15,0};
1.3527 +
1.3528 + a=BN_new();
1.3529 + if(errno==ENOMEM)
1.3530 + return 0;
1.3531 + b[0]=BN_new();
1.3532 + if(errno==ENOMEM)
1.3533 + return 0;
1.3534 + b[1]=BN_new();
1.3535 + if(errno==ENOMEM)
1.3536 + return 0;
1.3537 + c=BN_new();
1.3538 + if(errno==ENOMEM)
1.3539 + return 0;
1.3540 + d=BN_new();
1.3541 + if(errno==ENOMEM)
1.3542 + return 0;
1.3543 + e=BN_new();
1.3544 + if(errno==ENOMEM)
1.3545 + return 0;
1.3546 + f=BN_new();
1.3547 + if(errno==ENOMEM)
1.3548 + return 0;
1.3549 +
1.3550 + BN_GF2m_arr2poly(p0, b[0]);
1.3551 + if(errno==ENOMEM)
1.3552 + return 0;
1.3553 + BN_GF2m_arr2poly(p1, b[1]);
1.3554 + if(errno==ENOMEM)
1.3555 + return 0;
1.3556 +
1.3557 + for (i=0; i<num0; i++)
1.3558 + {
1.3559 + BN_bntest_rand(a, 512, 0, 0);
1.3560 + if(errno==ENOMEM)
1.3561 + return 0;
1.3562 + BN_bntest_rand(c, 512, 0, 0);
1.3563 + if(errno==ENOMEM)
1.3564 + return 0;
1.3565 + BN_bntest_rand(d, 512, 0, 0);
1.3566 + if(errno==ENOMEM)
1.3567 + return 0;
1.3568 + for (j=0; j < 2; j++)
1.3569 + {
1.3570 + BN_GF2m_mod_exp(e, a, c, b[j], ctx);
1.3571 + if(errno==ENOMEM)
1.3572 + return 0;
1.3573 + BN_GF2m_mod_exp(f, a, d, b[j], ctx);
1.3574 + if(errno==ENOMEM)
1.3575 + return 0;
1.3576 + BN_GF2m_mod_mul(e, e, f, b[j], ctx);
1.3577 + if(errno==ENOMEM)
1.3578 + return 0;
1.3579 + BN_add(f, c, d);
1.3580 + if(errno==ENOMEM)
1.3581 + return 0;
1.3582 + BN_GF2m_mod_exp(f, a, f, b[j], ctx);
1.3583 + if(errno==ENOMEM)
1.3584 + return 0;
1.3585 +#if 0 /* make test uses ouput in bc but bc can't handle GF(2^m) arithmetic */
1.3586 + if (bp != NULL)
1.3587 + {
1.3588 + if (!results)
1.3589 + {
1.3590 + BN_print(bp,a);
1.3591 + if(errno==ENOMEM)
1.3592 + return 0;
1.3593 + BIO_puts(bp, " ^ (");
1.3594 + if(errno==ENOMEM)
1.3595 + return 0;
1.3596 + BN_print(bp,c);
1.3597 + if(errno==ENOMEM)
1.3598 + return 0;
1.3599 + BIO_puts(bp," + ");
1.3600 + if(errno==ENOMEM)
1.3601 + return 0;
1.3602 + BN_print(bp,d);
1.3603 + if(errno==ENOMEM)
1.3604 + return 0;
1.3605 + BIO_puts(bp, ") = ");
1.3606 + if(errno==ENOMEM)
1.3607 + return 0;
1.3608 + BN_print(bp,e);
1.3609 + if(errno==ENOMEM)
1.3610 + return 0;
1.3611 + BIO_puts(bp, "; - ");
1.3612 + if(errno==ENOMEM)
1.3613 + return 0;
1.3614 + BN_print(bp,f);
1.3615 + if(errno==ENOMEM)
1.3616 + return 0;
1.3617 + BIO_puts(bp, " % ");
1.3618 + if(errno==ENOMEM)
1.3619 + return 0;
1.3620 + BN_print(bp,b[j]);
1.3621 + if(errno==ENOMEM)
1.3622 + return 0;
1.3623 + BIO_puts(bp,"\n");
1.3624 + if(errno==ENOMEM)
1.3625 + return 0;
1.3626 + }
1.3627 + }
1.3628 +#endif
1.3629 + BN_GF2m_add(f, e, f);
1.3630 + if(errno==ENOMEM)
1.3631 + return 0;
1.3632 + /* Test that a^(c+d)=a^c*a^d. */
1.3633 + if(!BN_is_zero(f))
1.3634 + {
1.3635 + if(errno==ENOMEM)
1.3636 + return 0;
1.3637 + fprintf(stderr,"GF(2^m) modular exponentiation test failed!\n");
1.3638 + goto err;
1.3639 + }
1.3640 + }
1.3641 + }
1.3642 + ret = 1;
1.3643 + err:
1.3644 + BN_free(a);
1.3645 + if(errno==ENOMEM)
1.3646 + return 0;
1.3647 + BN_free(b[0]);
1.3648 + if(errno==ENOMEM)
1.3649 + return 0;
1.3650 + BN_free(b[1]);
1.3651 + if(errno==ENOMEM)
1.3652 + return 0;
1.3653 + BN_free(c);
1.3654 + if(errno==ENOMEM)
1.3655 + return 0;
1.3656 + BN_free(d);
1.3657 + if(errno==ENOMEM)
1.3658 + return 0;
1.3659 + BN_free(e);
1.3660 + if(errno==ENOMEM)
1.3661 + return 0;
1.3662 + BN_free(f);
1.3663 + if(errno==ENOMEM)
1.3664 + return 0;
1.3665 + return ret;
1.3666 + }
1.3667 +
1.3668 +int test_gf2m_mod_sqrt(BIO *bp,BN_CTX *ctx)
1.3669 + {
1.3670 + BIGNUM *a,*b[2],*c,*d,*e,*f;
1.3671 + int i, j, ret = 0;
1.3672 + unsigned int p0[] = {163,7,6,3,0};
1.3673 + unsigned int p1[] = {193,15,0};
1.3674 +
1.3675 + a=BN_new();
1.3676 + if(errno==ENOMEM)
1.3677 + return 0;
1.3678 + b[0]=BN_new();
1.3679 + if(errno==ENOMEM)
1.3680 + return 0;
1.3681 + b[1]=BN_new();
1.3682 + if(errno==ENOMEM)
1.3683 + return 0;
1.3684 + c=BN_new();
1.3685 + if(errno==ENOMEM)
1.3686 + return 0;
1.3687 + d=BN_new();
1.3688 + if(errno==ENOMEM)
1.3689 + return 0;
1.3690 + e=BN_new();
1.3691 + if(errno==ENOMEM)
1.3692 + return 0;
1.3693 + f=BN_new();
1.3694 + if(errno==ENOMEM)
1.3695 + return 0;
1.3696 +
1.3697 + BN_GF2m_arr2poly(p0, b[0]);
1.3698 + if(errno==ENOMEM)
1.3699 + return 0;
1.3700 + BN_GF2m_arr2poly(p1, b[1]);
1.3701 + if(errno==ENOMEM)
1.3702 + return 0;
1.3703 +
1.3704 + for (i=0; i<num0; i++)
1.3705 + {
1.3706 + BN_bntest_rand(a, 512, 0, 0);
1.3707 + if(errno==ENOMEM)
1.3708 + return 0;
1.3709 + for (j=0; j < 2; j++)
1.3710 + {
1.3711 + BN_GF2m_mod(c, a, b[j]);
1.3712 + if(errno==ENOMEM)
1.3713 + return 0;
1.3714 + BN_GF2m_mod_sqrt(d, a, b[j], ctx);
1.3715 + if(errno==ENOMEM)
1.3716 + return 0;
1.3717 + BN_GF2m_mod_sqr(e, d, b[j], ctx);
1.3718 + if(errno==ENOMEM)
1.3719 + return 0;
1.3720 +#if 0 /* make test uses ouput in bc but bc can't handle GF(2^m) arithmetic */
1.3721 + if (bp != NULL)
1.3722 + {
1.3723 + if (!results)
1.3724 + {
1.3725 + BN_print(bp,d);
1.3726 + if(errno==ENOMEM)
1.3727 + return 0;
1.3728 + BIO_puts(bp, " ^ 2 - ");
1.3729 + if(errno==ENOMEM)
1.3730 + return 0;
1.3731 + BN_print(bp,a);
1.3732 + if(errno==ENOMEM)
1.3733 + return 0;
1.3734 + BIO_puts(bp,"\n");
1.3735 + if(errno==ENOMEM)
1.3736 + return 0;
1.3737 + }
1.3738 + }
1.3739 +#endif
1.3740 + BN_GF2m_add(f, c, e);
1.3741 + if(errno==ENOMEM)
1.3742 + return 0;
1.3743 + /* Test that d^2 = a, where d = sqrt(a). */
1.3744 + if(!BN_is_zero(f))
1.3745 + {
1.3746 + if(errno==ENOMEM)
1.3747 + return 0;
1.3748 + fprintf(stderr,"GF(2^m) modular square root test failed!\n");
1.3749 + goto err;
1.3750 + }
1.3751 + }
1.3752 + }
1.3753 + ret = 1;
1.3754 + err:
1.3755 + BN_free(a);
1.3756 + if(errno==ENOMEM)
1.3757 + return 0;
1.3758 + BN_free(b[0]);
1.3759 + if(errno==ENOMEM)
1.3760 + return 0;
1.3761 + BN_free(b[1]);
1.3762 + if(errno==ENOMEM)
1.3763 + return 0;
1.3764 + BN_free(c);
1.3765 + if(errno==ENOMEM)
1.3766 + return 0;
1.3767 + BN_free(d);
1.3768 + if(errno==ENOMEM)
1.3769 + return 0;
1.3770 + BN_free(e);
1.3771 + if(errno==ENOMEM)
1.3772 + return 0;
1.3773 + BN_free(f);
1.3774 + if(errno==ENOMEM)
1.3775 + return 0;
1.3776 + return ret;
1.3777 + }
1.3778 +
1.3779 +int test_gf2m_mod_solve_quad(BIO *bp,BN_CTX *ctx)
1.3780 + {
1.3781 + BIGNUM *a,*b[2],*c,*d,*e;
1.3782 + int i, j, s = 0, t, ret = 0;
1.3783 + unsigned int p0[] = {163,7,6,3,0};
1.3784 + unsigned int p1[] = {193,15,0};
1.3785 +
1.3786 + a=BN_new();
1.3787 + if(errno==ENOMEM)
1.3788 + return 0;
1.3789 + b[0]=BN_new();
1.3790 + if(errno==ENOMEM)
1.3791 + return 0;
1.3792 + b[1]=BN_new();
1.3793 + if(errno==ENOMEM)
1.3794 + return 0;
1.3795 + c=BN_new();
1.3796 + if(errno==ENOMEM)
1.3797 + return 0;
1.3798 + d=BN_new();
1.3799 + if(errno==ENOMEM)
1.3800 + return 0;
1.3801 + e=BN_new();
1.3802 + if(errno==ENOMEM)
1.3803 + return 0;
1.3804 +
1.3805 + BN_GF2m_arr2poly(p0, b[0]);
1.3806 + if(errno==ENOMEM)
1.3807 + return 0;
1.3808 + BN_GF2m_arr2poly(p1, b[1]);
1.3809 + if(errno==ENOMEM)
1.3810 + return 0;
1.3811 +
1.3812 + for (i=0; i<num0; i++)
1.3813 + {
1.3814 + BN_bntest_rand(a, 512, 0, 0);
1.3815 + if(errno==ENOMEM)
1.3816 + return 0;
1.3817 + for (j=0; j < 2; j++)
1.3818 + {
1.3819 + t = BN_GF2m_mod_solve_quad(c, a, b[j], ctx);
1.3820 + if(errno==ENOMEM)
1.3821 + return 0;
1.3822 + if (t)
1.3823 + {
1.3824 + s++;
1.3825 + BN_GF2m_mod_sqr(d, c, b[j], ctx);
1.3826 + if(errno==ENOMEM)
1.3827 + return 0;
1.3828 + BN_GF2m_add(d, c, d);
1.3829 + if(errno==ENOMEM)
1.3830 + return 0;
1.3831 + BN_GF2m_mod(e, a, b[j]);
1.3832 + if(errno==ENOMEM)
1.3833 + return 0;
1.3834 +#if 0 /* make test uses ouput in bc but bc can't handle GF(2^m) arithmetic */
1.3835 + if (bp != NULL)
1.3836 + {
1.3837 + if (!results)
1.3838 + {
1.3839 + BN_print(bp,c);
1.3840 + BIO_puts(bp, " is root of z^2 + z = ");
1.3841 + BN_print(bp,a);
1.3842 + BIO_puts(bp, " % ");
1.3843 + BN_print(bp,b[j]);
1.3844 + BIO_puts(bp, "\n");
1.3845 + }
1.3846 + }
1.3847 +#endif
1.3848 + BN_GF2m_add(e, e, d);
1.3849 + if(errno==ENOMEM)
1.3850 + return 0;
1.3851 + /* Test that solution of quadratic c satisfies c^2 + c = a. */
1.3852 + if(!BN_is_zero(e))
1.3853 + {
1.3854 + if(errno==ENOMEM)
1.3855 + return 0;
1.3856 + fprintf(stderr,"GF(2^m) modular solve quadratic test failed!\n");
1.3857 + goto err;
1.3858 + }
1.3859 +
1.3860 + }
1.3861 + else
1.3862 + {
1.3863 +#if 0 /* make test uses ouput in bc but bc can't handle GF(2^m) arithmetic */
1.3864 + if (bp != NULL)
1.3865 + {
1.3866 + if (!results)
1.3867 + {
1.3868 + BIO_puts(bp, "There are no roots of z^2 + z = ");
1.3869 + if(errno==ENOMEM)
1.3870 + return 0;
1.3871 + BN_print(bp,a);
1.3872 + if(errno==ENOMEM)
1.3873 + return 0;
1.3874 + BIO_puts(bp, " % ");
1.3875 + if(errno==ENOMEM)
1.3876 + return 0;
1.3877 + BN_print(bp,b[j]);
1.3878 + if(errno==ENOMEM)
1.3879 + return 0;
1.3880 + BIO_puts(bp, "\n");
1.3881 + if(errno==ENOMEM)
1.3882 + return 0;
1.3883 + }
1.3884 + }
1.3885 +#endif
1.3886 + }
1.3887 + }
1.3888 + }
1.3889 + if (s == 0)
1.3890 + {
1.3891 + fprintf(stderr,"All %i tests of GF(2^m) modular solve quadratic resulted in no roots;\n", num0);
1.3892 + fprintf(stderr,"this is very unlikely and probably indicates an error.\n");
1.3893 + goto err;
1.3894 + }
1.3895 + ret = 1;
1.3896 + err:
1.3897 + BN_free(a);
1.3898 + if(errno==ENOMEM)
1.3899 + return 0;
1.3900 + BN_free(b[0]);
1.3901 + if(errno==ENOMEM)
1.3902 + return 0;
1.3903 + BN_free(b[1]);
1.3904 + if(errno==ENOMEM)
1.3905 + return 0;
1.3906 + BN_free(c);
1.3907 + if(errno==ENOMEM)
1.3908 + return 0;
1.3909 + BN_free(d);
1.3910 + if(errno==ENOMEM)
1.3911 + return 0;
1.3912 + BN_free(e);
1.3913 + if(errno==ENOMEM)
1.3914 + return 0;
1.3915 + return ret;
1.3916 + }
1.3917 +
1.3918 +static int genprime_cb(int p, int n, BN_GENCB *arg)
1.3919 + {
1.3920 + char c='*';
1.3921 +
1.3922 + if (p == 0) c='.';
1.3923 + if (p == 1) c='+';
1.3924 + if (p == 2) c='*';
1.3925 + if (p == 3) c='\n';
1.3926 + putc(c, stderr);
1.3927 + fflush(stderr);
1.3928 + return 1;
1.3929 + }
1.3930 +
1.3931 +int test_kron(BIO *bp, BN_CTX *ctx)
1.3932 + {
1.3933 + BN_GENCB cb;
1.3934 + BIGNUM *a,*b,*r,*t;
1.3935 + int i;
1.3936 + int legendre, kronecker;
1.3937 + int ret = 0;
1.3938 +
1.3939 + a = BN_new();
1.3940 + if(errno==ENOMEM)
1.3941 + return 0;
1.3942 + b = BN_new();
1.3943 + if(errno==ENOMEM)
1.3944 + return 0;
1.3945 + r = BN_new();
1.3946 + if(errno==ENOMEM)
1.3947 + return 0;
1.3948 + t = BN_new();
1.3949 + if(errno==ENOMEM)
1.3950 + return 0;
1.3951 + if (a == NULL || b == NULL || r == NULL || t == NULL) goto err;
1.3952 +
1.3953 + BN_GENCB_set(&cb, genprime_cb, NULL);
1.3954 + if(errno==ENOMEM)
1.3955 + return 0;
1.3956 +
1.3957 + /* We test BN_kronecker(a, b, ctx) just for b odd (Jacobi symbol).
1.3958 + * In this case we know that if b is prime, then BN_kronecker(a, b, ctx)
1.3959 + * is congruent to $a^{(b-1)/2}$, modulo $b$ (Legendre symbol).
1.3960 + * So we generate a random prime b and compare these values
1.3961 + * for a number of random a's. (That is, we run the Solovay-Strassen
1.3962 + * primality test to confirm that b is prime, except that we
1.3963 + * don't want to test whether b is prime but whether BN_kronecker
1.3964 + * works.) */
1.3965 +
1.3966 + if (!BN_generate_prime_ex(b, 512, 0, NULL, NULL, &cb))
1.3967 + {
1.3968 +
1.3969 + if(errno==ENOMEM)
1.3970 + return 0;
1.3971 + goto err;
1.3972 + }
1.3973 + b->neg = rand_neg();
1.3974 +
1.3975 + if(errno==ENOMEM)
1.3976 + return 0;
1.3977 + putc('\n', stderr);
1.3978 +
1.3979 + for (i = 0; i < num0; i++)
1.3980 + {
1.3981 + if (!BN_bntest_rand(a, 512, 0, 0))
1.3982 + {
1.3983 + if(errno==ENOMEM)
1.3984 + return 0;
1.3985 + goto err;
1.3986 + }
1.3987 + a->neg = rand_neg();
1.3988 +
1.3989 + if(errno==ENOMEM)
1.3990 + return 0;
1.3991 +
1.3992 + /* t := (|b|-1)/2 (note that b is odd) */
1.3993 + if (!BN_copy(t, b)) goto err;
1.3994 + t->neg = 0;
1.3995 + if (!BN_sub_word(t, 1)) goto err;
1.3996 + if (!BN_rshift1(t, t)) goto err;
1.3997 + /* r := a^t mod b */
1.3998 + b->neg=0;
1.3999 +
1.4000 + if (!BN_mod_exp_recp(r, a, t, b, ctx)) goto err;
1.4001 + b->neg=1;
1.4002 +
1.4003 + if (BN_is_word(r, 1))
1.4004 + legendre = 1;
1.4005 + else if (BN_is_zero(r))
1.4006 + legendre = 0;
1.4007 + else
1.4008 + {
1.4009 + if (!BN_add_word(r, 1)) goto err;
1.4010 + if (0 != BN_ucmp(r, b))
1.4011 + {
1.4012 + fprintf(stderr, "Legendre symbol computation failed\n");
1.4013 + goto err;
1.4014 + }
1.4015 + legendre = -1;
1.4016 + }
1.4017 +
1.4018 + kronecker = BN_kronecker(a, b, ctx);
1.4019 + if (kronecker < -1) goto err;
1.4020 + /* we actually need BN_kronecker(a, |b|) */
1.4021 + if (a->neg && b->neg)
1.4022 + kronecker = -kronecker;
1.4023 +
1.4024 + if (legendre != kronecker)
1.4025 + {
1.4026 + fprintf(stderr, "legendre != kronecker; a = ");
1.4027 + BN_print_fp(stderr, a);
1.4028 + fprintf(stderr, ", b = ");
1.4029 + BN_print_fp(stderr, b);
1.4030 + fprintf(stderr, "\n");
1.4031 + goto err;
1.4032 + }
1.4033 +
1.4034 + putc('.', stderr);
1.4035 + fflush(stderr);
1.4036 + }
1.4037 +
1.4038 + putc('\n', stderr);
1.4039 + fflush(stderr);
1.4040 + ret = 1;
1.4041 + err:
1.4042 + if (a != NULL) BN_free(a);
1.4043 + if (b != NULL) BN_free(b);
1.4044 + if (r != NULL) BN_free(r);
1.4045 + if (t != NULL) BN_free(t);
1.4046 + if(errno==ENOMEM)
1.4047 + return 0;
1.4048 + return ret;
1.4049 + }
1.4050 +
1.4051 +int test_sqrt(BIO *bp, BN_CTX *ctx)
1.4052 + {
1.4053 + BN_GENCB cb;
1.4054 + BIGNUM *a,*p,*r;
1.4055 + int i, j;
1.4056 + int ret = 0;
1.4057 +
1.4058 + a = BN_new();
1.4059 + if(errno==ENOMEM)
1.4060 + return 0;
1.4061 + p = BN_new();
1.4062 + if(errno==ENOMEM)
1.4063 + return 0;
1.4064 + r = BN_new();
1.4065 + if(errno==ENOMEM)
1.4066 + return 0;
1.4067 + if (a == NULL || p == NULL || r == NULL) goto err;
1.4068 +
1.4069 + BN_GENCB_set(&cb, genprime_cb, NULL);
1.4070 + if(errno==ENOMEM)
1.4071 + return 0;
1.4072 +
1.4073 + for (i = 0; i < 16; i++)
1.4074 + {
1.4075 + if (i < 8)
1.4076 + {
1.4077 + unsigned primes[8] = { 2, 3, 5, 7, 11, 13, 17, 19 };
1.4078 +
1.4079 + if (!BN_set_word(p, primes[i])) goto err;
1.4080 + }
1.4081 + else
1.4082 + {
1.4083 + if (!BN_set_word(a, 32)) goto err;
1.4084 + if (!BN_set_word(r, 2*i + 1)) goto err;
1.4085 +
1.4086 + if (!BN_generate_prime_ex(p, 256, 0, a, r, &cb)) goto err;
1.4087 + putc('\n', stderr);
1.4088 + }
1.4089 + p->neg = rand_neg();
1.4090 +
1.4091 + if(errno==ENOMEM)
1.4092 + return 0;
1.4093 + for (j = 0; j < num2; j++)
1.4094 + {
1.4095 + /* construct 'a' such that it is a square modulo p,
1.4096 + * but in general not a proper square and not reduced modulo p */
1.4097 + if (!BN_bntest_rand(r, 256, 0, 3)) goto err;
1.4098 + if (!BN_nnmod(r, r, p, ctx)) goto err;
1.4099 + if (!BN_mod_sqr(r, r, p, ctx)) goto err;
1.4100 + if (!BN_bntest_rand(a, 256, 0, 3)) goto err;
1.4101 + if (!BN_nnmod(a, a, p, ctx)) goto err;
1.4102 + if (!BN_mod_sqr(a, a, p, ctx)) goto err;
1.4103 + if (!BN_mul(a, a, r, ctx)) goto err;
1.4104 + if (rand_neg())
1.4105 + if (!BN_sub(a, a, p)) goto err;
1.4106 +
1.4107 + if (!BN_mod_sqrt(r, a, p, ctx)) goto err;
1.4108 + if (!BN_mod_sqr(r, r, p, ctx)) goto err;
1.4109 +
1.4110 + if (!BN_nnmod(a, a, p, ctx)) goto err;
1.4111 +
1.4112 + if (BN_cmp(a, r) != 0)
1.4113 + {
1.4114 + fprintf(stderr, "BN_mod_sqrt failed: a = ");
1.4115 + BN_print_fp(stderr, a);
1.4116 + fprintf(stderr, ", r = ");
1.4117 + BN_print_fp(stderr, r);
1.4118 + fprintf(stderr, ", p = ");
1.4119 + BN_print_fp(stderr, p);
1.4120 + fprintf(stderr, "\n");
1.4121 + goto err;
1.4122 + }
1.4123 +
1.4124 + putc('.', stderr);
1.4125 + fflush(stderr);
1.4126 + }
1.4127 +
1.4128 + putc('\n', stderr);
1.4129 + fflush(stderr);
1.4130 + }
1.4131 + ret = 1;
1.4132 + err:
1.4133 + if (a != NULL) BN_free(a);
1.4134 + if (p != NULL) BN_free(p);
1.4135 + if (r != NULL) BN_free(r);
1.4136 +
1.4137 + if(errno==ENOMEM)
1.4138 + return 0;
1.4139 + return ret;
1.4140 + }
1.4141 +
1.4142 +int test_lshift(BIO *bp,BN_CTX *ctx,BIGNUM *a_)
1.4143 + {
1.4144 + BIGNUM *a,*b,*c,*d;
1.4145 + int i;
1.4146 +
1.4147 + b=BN_new();
1.4148 + if(errno==ENOMEM)
1.4149 + return 0;
1.4150 + c=BN_new();
1.4151 + if(errno==ENOMEM)
1.4152 + return 0;
1.4153 + d=BN_new();
1.4154 + if(errno==ENOMEM)
1.4155 + return 0;
1.4156 + BN_one(c);
1.4157 + if(errno==ENOMEM)
1.4158 + return 0;
1.4159 +
1.4160 + if(a_)
1.4161 + a=a_;
1.4162 + else
1.4163 + {
1.4164 + a=BN_new();
1.4165 + if(errno==ENOMEM)
1.4166 + return 0;
1.4167 + BN_bntest_rand(a,200,0,0); /**/
1.4168 + if(errno==ENOMEM)
1.4169 + return 0;
1.4170 + a->neg=rand_neg();
1.4171 + if(errno==ENOMEM)
1.4172 + return 0;
1.4173 + }
1.4174 + for (i=0; i<num0; i++)
1.4175 + {
1.4176 + BN_lshift(b,a,i+1);
1.4177 + if(errno==ENOMEM)
1.4178 + return 0;
1.4179 + BN_add(c,c,c);
1.4180 + if(errno==ENOMEM)
1.4181 + return 0;
1.4182 + if (bp != NULL)
1.4183 + {
1.4184 + if (!results)
1.4185 + {
1.4186 + BN_print(bp,a);
1.4187 + if(errno==ENOMEM)
1.4188 + return 0;
1.4189 + BIO_puts(bp," * ");
1.4190 + if(errno==ENOMEM)
1.4191 + return 0;
1.4192 + BN_print(bp,c);
1.4193 + if(errno==ENOMEM)
1.4194 + return 0;
1.4195 + BIO_puts(bp," - ");
1.4196 + if(errno==ENOMEM)
1.4197 + return 0;
1.4198 + }
1.4199 + BN_print(bp,b);
1.4200 + if(errno==ENOMEM)
1.4201 + return 0;
1.4202 + BIO_puts(bp,"\n");
1.4203 + if(errno==ENOMEM)
1.4204 + return 0;
1.4205 + }
1.4206 + BN_mul(d,a,c,ctx);
1.4207 + if(errno==ENOMEM)
1.4208 + return 0;
1.4209 + BN_sub(d,d,b);
1.4210 + if(errno==ENOMEM)
1.4211 + return 0;
1.4212 + if(!BN_is_zero(d))
1.4213 + {
1.4214 + if(errno==ENOMEM)
1.4215 + return 0;
1.4216 + fprintf(stderr,"Left shift test failed!\n");
1.4217 + fprintf(stderr,"a=");
1.4218 + BN_print_fp(stderr,a);
1.4219 + if(errno==ENOMEM)
1.4220 + return 0;
1.4221 + fprintf(stderr,"\nb=");
1.4222 + BN_print_fp(stderr,b);
1.4223 + if(errno==ENOMEM)
1.4224 + return 0;
1.4225 + fprintf(stderr,"\nc=");
1.4226 + BN_print_fp(stderr,c);
1.4227 + if(errno==ENOMEM)
1.4228 + return 0;
1.4229 + fprintf(stderr,"\nd=");
1.4230 + BN_print_fp(stderr,d);
1.4231 + if(errno==ENOMEM)
1.4232 + return 0;
1.4233 + fprintf(stderr,"\n");
1.4234 + return 0;
1.4235 + }
1.4236 + }
1.4237 + BN_free(a);
1.4238 + if(errno==ENOMEM)
1.4239 + return 0;
1.4240 + BN_free(b);
1.4241 + if(errno==ENOMEM)
1.4242 + return 0;
1.4243 + BN_free(c);
1.4244 + if(errno==ENOMEM)
1.4245 + return 0;
1.4246 + BN_free(d);
1.4247 + if(errno==ENOMEM)
1.4248 + return 0;
1.4249 + return(1);
1.4250 + }
1.4251 +
1.4252 +int test_lshift1(BIO *bp)
1.4253 + {
1.4254 + BIGNUM *a,*b,*c;
1.4255 + int i;
1.4256 +
1.4257 + a=BN_new();
1.4258 + if(errno==ENOMEM)
1.4259 + return 0;
1.4260 + b=BN_new();
1.4261 + if(errno==ENOMEM)
1.4262 + return 0;
1.4263 + c=BN_new();
1.4264 + if(errno==ENOMEM)
1.4265 + return 0;
1.4266 +
1.4267 + BN_bntest_rand(a,200,0,0); /**/
1.4268 + if(errno==ENOMEM)
1.4269 + return 0;
1.4270 + a->neg=rand_neg();
1.4271 + if(errno==ENOMEM)
1.4272 + return 0;
1.4273 + for (i=0; i<num0; i++)
1.4274 + {
1.4275 + BN_lshift1(b,a);
1.4276 + if(errno==ENOMEM)
1.4277 + return 0;
1.4278 + if (bp != NULL)
1.4279 + {
1.4280 + if (!results)
1.4281 + {
1.4282 + BN_print(bp,a);
1.4283 + if(errno==ENOMEM)
1.4284 + return 0;
1.4285 + BIO_puts(bp," * 2");
1.4286 + if(errno==ENOMEM)
1.4287 + return 0;
1.4288 + BIO_puts(bp," - ");
1.4289 + if(errno==ENOMEM)
1.4290 + return 0;
1.4291 + }
1.4292 + BN_print(bp,b);
1.4293 + if(errno==ENOMEM)
1.4294 + return 0;
1.4295 + BIO_puts(bp,"\n");
1.4296 + if(errno==ENOMEM)
1.4297 + return 0;
1.4298 + }
1.4299 + BN_add(c,a,a);
1.4300 + if(errno==ENOMEM)
1.4301 + return 0;
1.4302 + BN_sub(a,b,c);
1.4303 + if(errno==ENOMEM)
1.4304 + return 0;
1.4305 + if(!BN_is_zero(a))
1.4306 + {
1.4307 + if(errno==ENOMEM)
1.4308 + return 0;
1.4309 + fprintf(stderr,"Left shift one test failed!\n");
1.4310 + return 0;
1.4311 + }
1.4312 +
1.4313 + BN_copy(a,b);
1.4314 + if(errno==ENOMEM)
1.4315 + return 0;
1.4316 + }
1.4317 + BN_free(a);
1.4318 + if(errno==ENOMEM)
1.4319 + return 0;
1.4320 + BN_free(b);
1.4321 + if(errno==ENOMEM)
1.4322 + return 0;
1.4323 + BN_free(c);
1.4324 + if(errno==ENOMEM)
1.4325 + return 0;
1.4326 + return(1);
1.4327 + }
1.4328 +
1.4329 +int test_rshift(BIO *bp,BN_CTX *ctx)
1.4330 + {
1.4331 + BIGNUM *a,*b,*c,*d,*e;
1.4332 + int i;
1.4333 +
1.4334 + a=BN_new();
1.4335 + if(errno==ENOMEM)
1.4336 + return 0;
1.4337 + b=BN_new();
1.4338 + if(errno==ENOMEM)
1.4339 + return 0;
1.4340 + c=BN_new();
1.4341 + if(errno==ENOMEM)
1.4342 + return 0;
1.4343 + d=BN_new();
1.4344 + if(errno==ENOMEM)
1.4345 + return 0;
1.4346 + e=BN_new();
1.4347 + if(errno==ENOMEM)
1.4348 + return 0;
1.4349 + BN_one(c);
1.4350 + if(errno==ENOMEM)
1.4351 + return 0;
1.4352 +
1.4353 + BN_bntest_rand(a,200,0,0); /**/
1.4354 + if(errno==ENOMEM)
1.4355 + return 0;
1.4356 + a->neg=rand_neg();
1.4357 + if(errno==ENOMEM)
1.4358 + return 0;
1.4359 + for (i=0; i<num0; i++)
1.4360 + {
1.4361 + BN_rshift(b,a,i+1);
1.4362 + if(errno==ENOMEM)
1.4363 + return 0;
1.4364 + BN_add(c,c,c);
1.4365 + if(errno==ENOMEM)
1.4366 + return 0;
1.4367 + if (bp != NULL)
1.4368 + {
1.4369 + if (!results)
1.4370 + {
1.4371 + BN_print(bp,a);
1.4372 + if(errno==ENOMEM)
1.4373 + return 0;
1.4374 + BIO_puts(bp," / ");
1.4375 + if(errno==ENOMEM)
1.4376 + return 0;
1.4377 + BN_print(bp,c);
1.4378 + if(errno==ENOMEM)
1.4379 + return 0;
1.4380 + BIO_puts(bp," - ");
1.4381 + if(errno==ENOMEM)
1.4382 + return 0;
1.4383 + }
1.4384 + BN_print(bp,b);
1.4385 + if(errno==ENOMEM)
1.4386 + return 0;
1.4387 + BIO_puts(bp,"\n");
1.4388 + if(errno==ENOMEM)
1.4389 + return 0;
1.4390 + }
1.4391 + BN_div(d,e,a,c,ctx);
1.4392 + if(errno==ENOMEM)
1.4393 + return 0;
1.4394 + BN_sub(d,d,b);
1.4395 + if(errno==ENOMEM)
1.4396 + return 0;
1.4397 + if(!BN_is_zero(d))
1.4398 + {
1.4399 + if(errno==ENOMEM)
1.4400 + return 0;
1.4401 + fprintf(stderr,"Right shift test failed!\n");
1.4402 + return 0;
1.4403 + }
1.4404 + }
1.4405 + BN_free(a);
1.4406 + if(errno==ENOMEM)
1.4407 + return 0;
1.4408 + BN_free(b);
1.4409 + if(errno==ENOMEM)
1.4410 + return 0;
1.4411 + BN_free(c);
1.4412 + if(errno==ENOMEM)
1.4413 + return 0;
1.4414 + BN_free(d);
1.4415 + if(errno==ENOMEM)
1.4416 + return 0;
1.4417 + BN_free(e);
1.4418 + if(errno==ENOMEM)
1.4419 + return 0;
1.4420 + return(1);
1.4421 + }
1.4422 +
1.4423 +int test_rshift1(BIO *bp)
1.4424 + {
1.4425 + BIGNUM *a,*b,*c;
1.4426 + int i;
1.4427 +
1.4428 + a=BN_new();
1.4429 + if(errno==ENOMEM)
1.4430 + return 0;
1.4431 + b=BN_new();
1.4432 + if(errno==ENOMEM)
1.4433 + return 0;
1.4434 + c=BN_new();
1.4435 + if(errno==ENOMEM)
1.4436 + return 0;
1.4437 +
1.4438 + BN_bntest_rand(a,200,0,0); /**/
1.4439 + if(errno==ENOMEM)
1.4440 + return 0;
1.4441 + a->neg=rand_neg();
1.4442 + if(errno==ENOMEM)
1.4443 + return 0;
1.4444 + for (i=0; i<num0; i++)
1.4445 + {
1.4446 + BN_rshift1(b,a);
1.4447 + if(errno==ENOMEM)
1.4448 + return 0;
1.4449 + if (bp != NULL)
1.4450 + {
1.4451 + if (!results)
1.4452 + {
1.4453 + BN_print(bp,a);
1.4454 + if(errno==ENOMEM)
1.4455 + return 0;
1.4456 + BIO_puts(bp," / 2");
1.4457 + if(errno==ENOMEM)
1.4458 + return 0;
1.4459 + BIO_puts(bp," - ");
1.4460 + if(errno==ENOMEM)
1.4461 + return 0;
1.4462 + }
1.4463 + BN_print(bp,b);
1.4464 + if(errno==ENOMEM)
1.4465 + return 0;
1.4466 + BIO_puts(bp,"\n");
1.4467 + if(errno==ENOMEM)
1.4468 + return 0;
1.4469 + }
1.4470 + BN_sub(c,a,b);
1.4471 + if(errno==ENOMEM)
1.4472 + return 0;
1.4473 + BN_sub(c,c,b);
1.4474 + if(errno==ENOMEM)
1.4475 + return 0;
1.4476 + if(!BN_is_zero(c) && !BN_abs_is_word(c, 1))
1.4477 + {
1.4478 + if(errno==ENOMEM)
1.4479 + return 0;
1.4480 + fprintf(stderr,"Right shift one test failed!\n");
1.4481 + return 0;
1.4482 + }
1.4483 + BN_copy(a,b);
1.4484 + if(errno==ENOMEM)
1.4485 + return 0;
1.4486 + }
1.4487 + BN_free(a);
1.4488 + if(errno==ENOMEM)
1.4489 + return 0;
1.4490 + BN_free(b);
1.4491 + if(errno==ENOMEM)
1.4492 + return 0;
1.4493 + BN_free(c);
1.4494 + if(errno==ENOMEM)
1.4495 + return 0;
1.4496 + return(1);
1.4497 + }
1.4498 +
1.4499 +int rand_neg(void)
1.4500 + {
1.4501 + static unsigned int neg=0;
1.4502 + static int sign[8]={0,0,0,1,1,0,1,1};
1.4503 +
1.4504 + return(sign[(neg++)%8]);
1.4505 + }