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