159191Skris#include <openssl/bn.h> 259191Skris#include <openssl/rand.h> 359191Skris 4109998Smarkmstatic int Rand(n) 559191Skris{ 659191Skris unsigned char x[2]; 759191Skris RAND_pseudo_bytes(x,2); 859191Skris return (x[0] + 2*x[1]); 959191Skris} 1059191Skris 1159191Skrisstatic void bug(char *m, BIGNUM *a, BIGNUM *b) 1259191Skris{ 1359191Skris printf("%s!\na=",m); 1459191Skris BN_print_fp(stdout, a); 1559191Skris printf("\nb="); 1659191Skris BN_print_fp(stdout, b); 1759191Skris printf("\n"); 1859191Skris fflush(stdout); 1959191Skris} 2059191Skris 2159191Skrismain() 2259191Skris{ 2359191Skris BIGNUM *a=BN_new(), *b=BN_new(), *c=BN_new(), *d=BN_new(), 2459191Skris *C=BN_new(), *D=BN_new(); 2559191Skris BN_RECP_CTX *recp=BN_RECP_CTX_new(); 2659191Skris BN_CTX *ctx=BN_CTX_new(); 2759191Skris 2859191Skris for(;;) { 29109998Smarkm BN_pseudo_rand(a,Rand(),0,0); 30109998Smarkm BN_pseudo_rand(b,Rand(),0,0); 3159191Skris if (BN_is_zero(b)) continue; 3259191Skris 3359191Skris BN_RECP_CTX_set(recp,b,ctx); 3459191Skris if (BN_div(C,D,a,b,ctx) != 1) 3559191Skris bug("BN_div failed",a,b); 3659191Skris if (BN_div_recp(c,d,a,recp,ctx) != 1) 3759191Skris bug("BN_div_recp failed",a,b); 3859191Skris else if (BN_cmp(c,C) != 0 || BN_cmp(c,C) != 0) 3959191Skris bug("mismatch",a,b); 4059191Skris } 4159191Skris} 42