1/* 2 * Copyright (c) 2000-2001,2011,2014 Apple Inc. All Rights Reserved. 3 * 4 * The contents of this file constitute Original Code as defined in and are 5 * subject to the Apple Public Source License Version 1.2 (the 'License'). 6 * You may not use this file except in compliance with the License. Please obtain 7 * a copy of the License at http://www.apple.com/publicsource and read it before 8 * using this file. 9 * 10 * This Original Code and all software distributed under the License are 11 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS 12 * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT 13 * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 14 * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the 15 * specific language governing rights and limitations under the License. 16 */ 17 18 19/* crypto/bn/exptest.c */ 20/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 21 * All rights reserved. 22 * 23 * This package is an SSL implementation written 24 * by Eric Young (eay@cryptsoft.com). 25 * The implementation was written so as to conform with Netscapes SSL. 26 * 27 * This library is free for commercial and non-commercial use as long as 28 * the following conditions are aheared to. The following conditions 29 * apply to all code found in this distribution, be it the RC4, RSA, 30 * lhash, DES, etc., code; not just the SSL code. The SSL documentation 31 * included with this distribution is covered by the same copyright terms 32 * except that the holder is Tim Hudson (tjh@cryptsoft.com). 33 * 34 * Copyright remains Eric Young's, and as such any Copyright notices in 35 * the code are not to be removed. 36 * If this package is used in a product, Eric Young should be given attribution 37 * as the author of the parts of the library used. 38 * This can be in the form of a textual message at program startup or 39 * in documentation (online or textual) provided with the package. 40 * 41 * Redistribution and use in source and binary forms, with or without 42 * modification, are permitted provided that the following conditions 43 * are met: 44 * 1. Redistributions of source code must retain the copyright 45 * notice, this list of conditions and the following disclaimer. 46 * 2. Redistributions in binary form must reproduce the above copyright 47 * notice, this list of conditions and the following disclaimer in the 48 * documentation and/or other materials provided with the distribution. 49 * 3. All advertising materials mentioning features or use of this software 50 * must display the following acknowledgement: 51 * "This product includes cryptographic software written by 52 * Eric Young (eay@cryptsoft.com)" 53 * The word 'cryptographic' can be left out if the rouines from the library 54 * being used are not cryptographic related :-). 55 * 4. If you include any Windows specific code (or a derivative thereof) from 56 * the apps directory (application code) you must include an acknowledgement: 57 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 58 * 59 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 60 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 61 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 62 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 63 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 64 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 65 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 66 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 67 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 68 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 69 * SUCH DAMAGE. 70 * 71 * The licence and distribution terms for any publically available version or 72 * derivative of this code cannot be changed. i.e. this code cannot simply be 73 * copied and put under another distribution licence 74 * [including the GNU Public Licence.] 75 */ 76 77#include <stdio.h> 78#include <stdlib.h> 79#include <string.h> 80#include <openssl/bio.h> 81#include <openssl/bn.h> 82#include <openssl/rand.h> 83#include <openssl/err.h> 84#ifdef WINDOWS 85#include "../bio/bss_file.c" 86#endif 87 88#define NUM_BITS (BN_BITS*2) 89 90static const char rnd_seed[] = "string to make the random number generator think it has entropy"; 91 92int main(int argc, char *argv[]) 93 { 94 BN_CTX *ctx; 95 BIO *out=NULL; 96 int i,ret; 97 unsigned char c; 98 BIGNUM *r_mont,*r_recp,*r_simple,*a,*b,*m; 99 100 RAND_seed(rnd_seed, sizeof rnd_seed); /* or BN_rand may fail, and we don't 101 * even check its return value 102 * (which we should) */ 103 104 ERR_load_BN_strings(); 105 106 ctx=BN_CTX_new(); 107 if (ctx == NULL) exit(1); 108 r_mont=BN_new(); 109 r_recp=BN_new(); 110 r_simple=BN_new(); 111 a=BN_new(); 112 b=BN_new(); 113 m=BN_new(); 114 if ( (r_mont == NULL) || (r_recp == NULL) || 115 (a == NULL) || (b == NULL)) 116 goto err; 117 118 out=BIO_new(BIO_s_file()); 119 120 if (out == NULL) exit(1); 121 BIO_set_fp(out,stdout,BIO_NOCLOSE); 122 123 for (i=0; i<200; i++) 124 { 125 RAND_bytes(&c,1); 126 c=(c%BN_BITS)-BN_BITS2; 127 BN_rand(a,NUM_BITS+c,0,0); 128 129 RAND_bytes(&c,1); 130 c=(c%BN_BITS)-BN_BITS2; 131 BN_rand(b,NUM_BITS+c,0,0); 132 133 RAND_bytes(&c,1); 134 c=(c%BN_BITS)-BN_BITS2; 135 BN_rand(m,NUM_BITS+c,0,1); 136 137 BN_mod(a,a,m,ctx); 138 BN_mod(b,b,m,ctx); 139 140 ret=BN_mod_exp_mont(r_mont,a,b,m,ctx,NULL); 141 if (ret <= 0) 142 { 143 printf("BN_mod_exp_mont() problems\n"); 144 ERR_print_errors(out); 145 exit(1); 146 } 147 148 ret=BN_mod_exp_recp(r_recp,a,b,m,ctx); 149 if (ret <= 0) 150 { 151 printf("BN_mod_exp_recp() problems\n"); 152 ERR_print_errors(out); 153 exit(1); 154 } 155 156 ret=BN_mod_exp_simple(r_simple,a,b,m,ctx); 157 if (ret <= 0) 158 { 159 printf("BN_mod_exp_simple() problems\n"); 160 ERR_print_errors(out); 161 exit(1); 162 } 163 164 if (BN_cmp(r_simple, r_mont) == 0 165 && BN_cmp(r_simple,r_recp) == 0) 166 { 167 printf("."); 168 fflush(stdout); 169 } 170 else 171 { 172 if (BN_cmp(r_simple,r_mont) != 0) 173 printf("\nsimple and mont results differ\n"); 174 if (BN_cmp(r_simple,r_recp) != 0) 175 printf("\nsimple and recp results differ\n"); 176 177 printf("a (%3d) = ",BN_num_bits(a)); BN_print(out,a); 178 printf("\nb (%3d) = ",BN_num_bits(b)); BN_print(out,b); 179 printf("\nm (%3d) = ",BN_num_bits(m)); BN_print(out,m); 180 printf("\nsimple ="); BN_print(out,r_simple); 181 printf("\nrecp ="); BN_print(out,r_recp); 182 printf("\nmont ="); BN_print(out,r_mont); 183 printf("\n"); 184 exit(1); 185 } 186 } 187 BN_free(r_mont); 188 BN_free(r_recp); 189 BN_free(r_simple); 190 BN_free(a); 191 BN_free(b); 192 BN_free(m); 193 BN_CTX_free(ctx); 194 ERR_remove_state(0); 195 CRYPTO_mem_leaks(out); 196 BIO_free(out); 197 printf(" done\n"); 198 exit(0); 199err: 200 ERR_load_crypto_strings(); 201 ERR_print_errors(out); 202 exit(1); 203 return(1); 204 } 205 206