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