|
1 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
2 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
4 |
|
5 #include <stdio.h> |
|
6 #include <stdlib.h> |
|
7 #include "mpi.h" |
|
8 #include "mpprime.h" |
|
9 #include <sys/types.h> |
|
10 #include <time.h> |
|
11 |
|
12 #define MAX_PREC (4096 / MP_DIGIT_BIT) |
|
13 |
|
14 mp_err identity_test(void) |
|
15 { |
|
16 mp_size preca, precb; |
|
17 mp_err res; |
|
18 mp_int a, b; |
|
19 mp_int t1, t2, t3, t4, t5; |
|
20 |
|
21 preca = (rand() % MAX_PREC) + 1; |
|
22 precb = (rand() % MAX_PREC) + 1; |
|
23 |
|
24 MP_DIGITS(&a) = 0; |
|
25 MP_DIGITS(&b) = 0; |
|
26 MP_DIGITS(&t1) = 0; |
|
27 MP_DIGITS(&t2) = 0; |
|
28 MP_DIGITS(&t3) = 0; |
|
29 MP_DIGITS(&t4) = 0; |
|
30 MP_DIGITS(&t5) = 0; |
|
31 |
|
32 MP_CHECKOK( mp_init(&a) ); |
|
33 MP_CHECKOK( mp_init(&b) ); |
|
34 MP_CHECKOK( mp_init(&t1) ); |
|
35 MP_CHECKOK( mp_init(&t2) ); |
|
36 MP_CHECKOK( mp_init(&t3) ); |
|
37 MP_CHECKOK( mp_init(&t4) ); |
|
38 MP_CHECKOK( mp_init(&t5) ); |
|
39 |
|
40 MP_CHECKOK( mpp_random_size(&a, preca) ); |
|
41 MP_CHECKOK( mpp_random_size(&b, precb) ); |
|
42 |
|
43 if (mp_cmp(&a, &b) < 0) |
|
44 mp_exch(&a, &b); |
|
45 |
|
46 MP_CHECKOK( mp_mod(&a, &b, &t1) ); /* t1 = a%b */ |
|
47 MP_CHECKOK( mp_div(&a, &b, &t2, NULL) ); /* t2 = a/b */ |
|
48 MP_CHECKOK( mp_mul(&b, &t2, &t3) ); /* t3 = (a/b)*b */ |
|
49 MP_CHECKOK( mp_add(&t1, &t3, &t4) ); /* t4 = a%b + (a/b)*b */ |
|
50 MP_CHECKOK( mp_sub(&t4, &a, &t5) ); /* t5 = a%b + (a/b)*b - a */ |
|
51 if (mp_cmp_z(&t5) != 0) { |
|
52 res = MP_UNDEF; |
|
53 goto CLEANUP; |
|
54 } |
|
55 |
|
56 CLEANUP: |
|
57 mp_clear(&t5); |
|
58 mp_clear(&t4); |
|
59 mp_clear(&t3); |
|
60 mp_clear(&t2); |
|
61 mp_clear(&t1); |
|
62 mp_clear(&b); |
|
63 mp_clear(&a); |
|
64 return res; |
|
65 } |
|
66 |
|
67 int |
|
68 main(void) |
|
69 { |
|
70 unsigned int seed = (unsigned int)time(NULL); |
|
71 unsigned long count = 0; |
|
72 mp_err res; |
|
73 |
|
74 srand(seed); |
|
75 |
|
76 while (MP_OKAY == (res = identity_test())) { |
|
77 if ((++count % 100) == 0) |
|
78 fputc('.', stderr); |
|
79 } |
|
80 |
|
81 fprintf(stderr, "\ntest failed, err %d\n", res); |
|
82 return res; |
|
83 } |