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#include <openssl/bn.h> 20#include <openssl/rand.h> 21 22static int rand(n) 23{ 24 unsigned char x[2]; 25 RAND_pseudo_bytes(x,2); 26 return (x[0] + 2*x[1]); 27} 28 29static void bug(char *m, BIGNUM *a, BIGNUM *b) 30{ 31 printf("%s!\na=",m); 32 BN_print_fp(stdout, a); 33 printf("\nb="); 34 BN_print_fp(stdout, b); 35 printf("\n"); 36 fflush(stdout); 37} 38 39main() 40{ 41 BIGNUM *a=BN_new(), *b=BN_new(), *c=BN_new(), *d=BN_new(), 42 *C=BN_new(), *D=BN_new(); 43 BN_RECP_CTX *recp=BN_RECP_CTX_new(); 44 BN_CTX *ctx=BN_CTX_new(); 45 46 for(;;) { 47 BN_pseudo_rand(a,rand(),0,0); 48 BN_pseudo_rand(b,rand(),0,0); 49 if (BN_is_zero(b)) continue; 50 51 BN_RECP_CTX_set(recp,b,ctx); 52 if (BN_div(C,D,a,b,ctx) != 1) 53 bug("BN_div failed",a,b); 54 if (BN_div_recp(c,d,a,recp,ctx) != 1) 55 bug("BN_div_recp failed",a,b); 56 else if (BN_cmp(c,C) != 0 || BN_cmp(c,C) != 0) 57 bug("mismatch",a,b); 58 } 59} 60