1 #include <openssl/bn.h> 2 #include <openssl/rand.h> 3 4 static int Rand(n) 5 { 6 unsigned char x[2]; 7 RAND_pseudo_bytes(x,2); 8 return (x[0] + 2*x[1]); 9 } 10 11 static void bug(char *m, BIGNUM *a, BIGNUM *b) 12 { 13 printf("%s!\na=",m); 14 BN_print_fp(stdout, a); 15 printf("\nb="); 16 BN_print_fp(stdout, b); 17 printf("\n"); 18 fflush(stdout); 19 } 20 21 main() 22 { 23 BIGNUM *a=BN_new(), *b=BN_new(), *c=BN_new(), *d=BN_new(), 24 *C=BN_new(), *D=BN_new(); 25 BN_RECP_CTX *recp=BN_RECP_CTX_new(); 26 BN_CTX *ctx=BN_CTX_new(); 27 28 for(;;) { 29 BN_pseudo_rand(a,Rand(),0,0); 30 BN_pseudo_rand(b,Rand(),0,0); 31 if (BN_is_zero(b)) continue; 32 33 BN_RECP_CTX_set(recp,b,ctx); 34 if (BN_div(C,D,a,b,ctx) != 1) 35 bug("BN_div failed",a,b); 36 if (BN_div_recp(c,d,a,recp,ctx) != 1) 37 bug("BN_div_recp failed",a,b); 38 else if (BN_cmp(c,C) != 0 || BN_cmp(c,C) != 0) 39 bug("mismatch",a,b); 40 } 41 } 42