xref: /netbsd-src/tests/crypto/libcrypto/bn/div/divtest.c (revision e1f413f949b9d2bf31beff6f35f2ea32286de027)
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