OLD | NEW |
1 /* | 1 /* |
2 * Simple test driver for MPI library | 2 * Simple test driver for MPI library |
3 * | 3 * |
4 * Test GF2m: Binary Polynomial Arithmetic | 4 * Test GF2m: Binary Polynomial Arithmetic |
5 * | 5 * |
6 * This Source Code Form is subject to the terms of the Mozilla Public | 6 * This Source Code Form is subject to the terms of the Mozilla Public |
7 * License, v. 2.0. If a copy of the MPL was not distributed with this | 7 * License, v. 2.0. If a copy of the MPL was not distributed with this |
8 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ | 8 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
9 | 9 |
10 #include <stdio.h> | 10 #include <stdio.h> |
11 #include <stdlib.h> | 11 #include <stdlib.h> |
12 #include <string.h> | 12 #include <string.h> |
13 #include <ctype.h> | 13 #include <ctype.h> |
14 #include <limits.h> | 14 #include <limits.h> |
15 | 15 |
16 #include "mp_gf2m.h" | 16 #include "mp_gf2m.h" |
17 | 17 |
18 int main(int argc, char *argv[]) | 18 int main(int argc, char *argv[]) { |
19 { | 19 int ix; |
20 int ix; | 20 mp_int pp, a, b, x, y, order; |
21 mp_int pp, a, b, x, y, order; | 21 mp_int c, d, e; |
22 mp_int c, d, e; | 22 mp_digit r; |
23 mp_digit r; | 23 mp_err res; |
24 mp_err res; | 24 unsigned int p[] = {163, 7, 6, 3, 0}; |
25 unsigned int p[] = {163,7,6,3,0}; | 25 unsigned int ptemp[10]; |
26 unsigned int ptemp[10]; | 26 |
27 | 27 printf("Test b: Binary Polynomial Arithmetic\n\n"); |
28 printf("Test b: Binary Polynomial Arithmetic\n\n"); | 28 |
29 | 29 mp_init(&pp); |
30 mp_init(&pp); | 30 mp_init(&a); |
31 mp_init(&a); | 31 mp_init(&b); |
32 mp_init(&b); | 32 mp_init(&x); |
33 mp_init(&x); | 33 mp_init(&y); |
34 mp_init(&y); | 34 mp_init(&order); |
35 mp_init(&order); | 35 |
36 | 36 mp_read_radix(&pp, "0800000000000000000000000000000000000000C9", 16); |
37 mp_read_radix(&pp, "0800000000000000000000000000000000000000C9", 16); | 37 mp_read_radix(&a, "1", 16); |
38 mp_read_radix(&a, "1", 16); | 38 mp_read_radix(&b, "020A601907B8C953CA1481EB10512F78744A3205FD", 16); |
39 mp_read_radix(&b, "020A601907B8C953CA1481EB10512F78744A3205FD", 16); | 39 mp_read_radix(&x, "03F0EBA16286A2D57EA0991168D4994637E8343E36", 16); |
40 mp_read_radix(&x, "03F0EBA16286A2D57EA0991168D4994637E8343E36", 16); | 40 mp_read_radix(&y, "00D51FBC6C71A0094FA2CDD545B11C5C0C797324F1", 16); |
41 mp_read_radix(&y, "00D51FBC6C71A0094FA2CDD545B11C5C0C797324F1", 16); | 41 mp_read_radix(&order, "040000000000000000000292FE77E70C12A4234C33", 16); |
42 mp_read_radix(&order, "040000000000000000000292FE77E70C12A4234C33", 16); | 42 printf("pp = "); |
43 printf("pp = "); mp_print(&pp, stdout); fputc('\n', stdout); | 43 mp_print(&pp, stdout); |
44 printf("a = "); mp_print(&a, stdout); fputc('\n', stdout); | 44 fputc('\n', stdout); |
45 printf("b = "); mp_print(&b, stdout); fputc('\n', stdout); | 45 printf("a = "); |
46 printf("x = "); mp_print(&x, stdout); fputc('\n', stdout); | 46 mp_print(&a, stdout); |
47 printf("y = "); mp_print(&y, stdout); fputc('\n', stdout); | 47 fputc('\n', stdout); |
48 printf("order = "); mp_print(&order, stdout); fputc('\n', stdout); | 48 printf("b = "); |
49 | 49 mp_print(&b, stdout); |
50 mp_init(&c); | 50 fputc('\n', stdout); |
51 mp_init(&d); | 51 printf("x = "); |
52 mp_init(&e); | 52 mp_print(&x, stdout); |
53 | 53 fputc('\n', stdout); |
54 /* Test polynomial conversion */ | 54 printf("y = "); |
55 ix = mp_bpoly2arr(&pp, ptemp, 10); | 55 mp_print(&y, stdout); |
56 if ( | 56 fputc('\n', stdout); |
57 (ix != 5) || | 57 printf("order = "); |
58 (ptemp[0] != p[0]) || | 58 mp_print(&order, stdout); |
59 (ptemp[1] != p[1]) || | 59 fputc('\n', stdout); |
60 (ptemp[2] != p[2]) || | 60 |
61 (ptemp[3] != p[3]) || | 61 mp_init(&c); |
62 (ptemp[4] != p[4]) | 62 mp_init(&d); |
63 ) { | 63 mp_init(&e); |
64 printf("Polynomial to array conversion not correct\n");· | 64 |
65 return -1; | 65 /* Test polynomial conversion */ |
66 } | 66 ix = mp_bpoly2arr(&pp, ptemp, 10); |
67 | 67 if ((ix != 5) || (ptemp[0] != p[0]) || (ptemp[1] != p[1]) || |
68 printf("Polynomial conversion test #1 successful.\n"); | 68 (ptemp[2] != p[2]) || (ptemp[3] != p[3]) || (ptemp[4] != p[4])) { |
69 MP_CHECKOK( mp_barr2poly(p, &c) ); | 69 printf("Polynomial to array conversion not correct\n"); |
70 if (mp_cmp(&pp, &c) != 0) { | 70 return -1; |
71 printf("Array to polynomial conversion not correct\n");· | 71 } |
72 return -1; | 72 |
73 } | 73 printf("Polynomial conversion test #1 successful.\n"); |
74 printf("Polynomial conversion test #2 successful.\n"); | 74 MP_CHECKOK(mp_barr2poly(p, &c)); |
75 | 75 if (mp_cmp(&pp, &c) != 0) { |
76 /* Test addition */ | 76 printf("Array to polynomial conversion not correct\n"); |
77 MP_CHECKOK( mp_badd(&a, &a, &c) ); | 77 return -1; |
78 if (mp_cmp_z(&c) != 0) { | 78 } |
79 printf("a+a should equal zero\n");· | 79 printf("Polynomial conversion test #2 successful.\n"); |
80 return -1; | 80 |
81 } | 81 /* Test addition */ |
82 printf("Addition test #1 successful.\n"); | 82 MP_CHECKOK(mp_badd(&a, &a, &c)); |
83 MP_CHECKOK( mp_badd(&a, &b, &c) ); | 83 if (mp_cmp_z(&c) != 0) { |
84 MP_CHECKOK( mp_badd(&b, &c, &c) ); | 84 printf("a+a should equal zero\n"); |
85 if (mp_cmp(&c, &a) != 0) { | 85 return -1; |
86 printf("c = (a + b) + b should equal a\n");· | 86 } |
87 printf("a = "); mp_print(&a, stdout); fputc('\n', stdout); | 87 printf("Addition test #1 successful.\n"); |
88 printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); | 88 MP_CHECKOK(mp_badd(&a, &b, &c)); |
89 return -1; | 89 MP_CHECKOK(mp_badd(&b, &c, &c)); |
90 } | 90 if (mp_cmp(&c, &a) != 0) { |
91 printf("Addition test #2 successful.\n"); | 91 printf("c = (a + b) + b should equal a\n"); |
92 ···· | 92 printf("a = "); |
93 /* Test multiplication */ | 93 mp_print(&a, stdout); |
94 mp_set(&c, 2); | 94 fputc('\n', stdout); |
95 MP_CHECKOK( mp_bmul(&b, &c, &c) ); | 95 printf("c = "); |
96 MP_CHECKOK( mp_badd(&b, &c, &c) ); | 96 mp_print(&c, stdout); |
97 mp_set(&d, 3); | 97 fputc('\n', stdout); |
98 MP_CHECKOK( mp_bmul(&b, &d, &d) ); | 98 return -1; |
99 if (mp_cmp(&c, &d) != 0) { | 99 } |
100 printf("c = (2 * b) + b should equal c = 3 * b\n");· | 100 printf("Addition test #2 successful.\n"); |
101 printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); | 101 |
102 printf("d = "); mp_print(&d, stdout); fputc('\n', stdout); | 102 /* Test multiplication */ |
103 return -1; | 103 mp_set(&c, 2); |
104 } | 104 MP_CHECKOK(mp_bmul(&b, &c, &c)); |
105 printf("Multiplication test #1 successful.\n"); | 105 MP_CHECKOK(mp_badd(&b, &c, &c)); |
106 | 106 mp_set(&d, 3); |
107 /* Test modular reduction */ | 107 MP_CHECKOK(mp_bmul(&b, &d, &d)); |
108 MP_CHECKOK( mp_bmod(&b, p, &c) ); | 108 if (mp_cmp(&c, &d) != 0) { |
109 if (mp_cmp(&b, &c) != 0) { | 109 printf("c = (2 * b) + b should equal c = 3 * b\n"); |
110 printf("c = b mod p should equal b\n");· | 110 printf("c = "); |
111 printf("b = "); mp_print(&b, stdout); fputc('\n', stdout); | 111 mp_print(&c, stdout); |
112 printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); | 112 fputc('\n', stdout); |
113 return -1; | 113 printf("d = "); |
114 } | 114 mp_print(&d, stdout); |
115 printf("Modular reduction test #1 successful.\n"); | 115 fputc('\n', stdout); |
116 MP_CHECKOK( mp_badd(&b, &pp, &c) ); | 116 return -1; |
117 MP_CHECKOK( mp_bmod(&c, p, &c) ); | 117 } |
118 if (mp_cmp(&b, &c) != 0) { | 118 printf("Multiplication test #1 successful.\n"); |
119 printf("c = (b + p) mod p should equal b\n");· | 119 |
120 printf("b = "); mp_print(&b, stdout); fputc('\n', stdout); | 120 /* Test modular reduction */ |
121 printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); | 121 MP_CHECKOK(mp_bmod(&b, p, &c)); |
122 return -1; | 122 if (mp_cmp(&b, &c) != 0) { |
123 } | 123 printf("c = b mod p should equal b\n"); |
124 printf("Modular reduction test #2 successful.\n"); | 124 printf("b = "); |
125 MP_CHECKOK( mp_bmul(&b, &pp, &c) ); | 125 mp_print(&b, stdout); |
126 MP_CHECKOK( mp_bmod(&c, p, &c) ); | 126 fputc('\n', stdout); |
127 if (mp_cmp_z(&c) != 0) { | 127 printf("c = "); |
128 printf("c = (b * p) mod p should equal 0\n");· | 128 mp_print(&c, stdout); |
129 printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); | 129 fputc('\n', stdout); |
130 return -1; | 130 return -1; |
131 } | 131 } |
132 printf("Modular reduction test #3 successful.\n"); | 132 printf("Modular reduction test #1 successful.\n"); |
133 | 133 MP_CHECKOK(mp_badd(&b, &pp, &c)); |
134 /* Test modular multiplication */ | 134 MP_CHECKOK(mp_bmod(&c, p, &c)); |
135 MP_CHECKOK( mp_bmulmod(&b, &pp, p, &c) ); | 135 if (mp_cmp(&b, &c) != 0) { |
136 if (mp_cmp_z(&c) != 0) { | 136 printf("c = (b + p) mod p should equal b\n"); |
137 printf("c = (b * p) mod p should equal 0\n");· | 137 printf("b = "); |
138 printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); | 138 mp_print(&b, stdout); |
139 return -1; | 139 fputc('\n', stdout); |
140 } | 140 printf("c = "); |
141 printf("Modular multiplication test #1 successful.\n"); | 141 mp_print(&c, stdout); |
142 mp_set(&c, 1); | 142 fputc('\n', stdout); |
143 MP_CHECKOK( mp_badd(&pp, &c, &c) ); | 143 return -1; |
144 MP_CHECKOK( mp_bmulmod(&b, &c, p, &c) ); | 144 } |
145 if (mp_cmp(&b, &c) != 0) { | 145 printf("Modular reduction test #2 successful.\n"); |
146 printf("c = (b * (p + 1)) mod p should equal b\n");· | 146 MP_CHECKOK(mp_bmul(&b, &pp, &c)); |
147 printf("b = "); mp_print(&b, stdout); fputc('\n', stdout); | 147 MP_CHECKOK(mp_bmod(&c, p, &c)); |
148 printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); | 148 if (mp_cmp_z(&c) != 0) { |
149 return -1; | 149 printf("c = (b * p) mod p should equal 0\n"); |
150 } | 150 printf("c = "); |
151 printf("Modular multiplication test #2 successful.\n"); | 151 mp_print(&c, stdout); |
152 | 152 fputc('\n', stdout); |
153 /* Test modular squaring */ | 153 return -1; |
154 MP_CHECKOK( mp_copy(&b, &c) ); | 154 } |
155 MP_CHECKOK( mp_bmulmod(&b, &c, p, &c) ); | 155 printf("Modular reduction test #3 successful.\n"); |
156 MP_CHECKOK( mp_bsqrmod(&b, p, &d) ); | 156 |
157 if (mp_cmp(&c, &d) != 0) { | 157 /* Test modular multiplication */ |
158 printf("c = (b * b) mod p should equal d = b^2 mod p\n");· | 158 MP_CHECKOK(mp_bmulmod(&b, &pp, p, &c)); |
159 printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); | 159 if (mp_cmp_z(&c) != 0) { |
160 printf("d = "); mp_print(&d, stdout); fputc('\n', stdout); | 160 printf("c = (b * p) mod p should equal 0\n"); |
161 return -1; | 161 printf("c = "); |
162 } | 162 mp_print(&c, stdout); |
163 printf("Modular squaring test #1 successful.\n"); | 163 fputc('\n', stdout); |
164 ···· | 164 return -1; |
165 /* Test modular division */ | 165 } |
166 MP_CHECKOK( mp_bdivmod(&b, &x, &pp, p, &c) ); | 166 printf("Modular multiplication test #1 successful.\n"); |
167 MP_CHECKOK( mp_bmulmod(&c, &x, p, &c) ); | 167 mp_set(&c, 1); |
168 if (mp_cmp(&b, &c) != 0) { | 168 MP_CHECKOK(mp_badd(&pp, &c, &c)); |
169 printf("c = (b / x) * x mod p should equal b\n");· | 169 MP_CHECKOK(mp_bmulmod(&b, &c, p, &c)); |
170 printf("b = "); mp_print(&b, stdout); fputc('\n', stdout); | 170 if (mp_cmp(&b, &c) != 0) { |
171 printf("c = "); mp_print(&c, stdout); fputc('\n', stdout); | 171 printf("c = (b * (p + 1)) mod p should equal b\n"); |
172 return -1; | 172 printf("b = "); |
173 } | 173 mp_print(&b, stdout); |
174 printf("Modular division test #1 successful.\n"); | 174 fputc('\n', stdout); |
| 175 printf("c = "); |
| 176 mp_print(&c, stdout); |
| 177 fputc('\n', stdout); |
| 178 return -1; |
| 179 } |
| 180 printf("Modular multiplication test #2 successful.\n"); |
| 181 |
| 182 /* Test modular squaring */ |
| 183 MP_CHECKOK(mp_copy(&b, &c)); |
| 184 MP_CHECKOK(mp_bmulmod(&b, &c, p, &c)); |
| 185 MP_CHECKOK(mp_bsqrmod(&b, p, &d)); |
| 186 if (mp_cmp(&c, &d) != 0) { |
| 187 printf("c = (b * b) mod p should equal d = b^2 mod p\n"); |
| 188 printf("c = "); |
| 189 mp_print(&c, stdout); |
| 190 fputc('\n', stdout); |
| 191 printf("d = "); |
| 192 mp_print(&d, stdout); |
| 193 fputc('\n', stdout); |
| 194 return -1; |
| 195 } |
| 196 printf("Modular squaring test #1 successful.\n"); |
| 197 |
| 198 /* Test modular division */ |
| 199 MP_CHECKOK(mp_bdivmod(&b, &x, &pp, p, &c)); |
| 200 MP_CHECKOK(mp_bmulmod(&c, &x, p, &c)); |
| 201 if (mp_cmp(&b, &c) != 0) { |
| 202 printf("c = (b / x) * x mod p should equal b\n"); |
| 203 printf("b = "); |
| 204 mp_print(&b, stdout); |
| 205 fputc('\n', stdout); |
| 206 printf("c = "); |
| 207 mp_print(&c, stdout); |
| 208 fputc('\n', stdout); |
| 209 return -1; |
| 210 } |
| 211 printf("Modular division test #1 successful.\n"); |
175 | 212 |
176 CLEANUP: | 213 CLEANUP: |
177 | 214 |
178 mp_clear(&order); | 215 mp_clear(&order); |
179 mp_clear(&y); | 216 mp_clear(&y); |
180 mp_clear(&x); | 217 mp_clear(&x); |
181 mp_clear(&b); | 218 mp_clear(&b); |
182 mp_clear(&a); | 219 mp_clear(&a); |
183 mp_clear(&pp); | 220 mp_clear(&pp); |
184 | 221 |
185 return 0; | 222 return 0; |
186 } | 223 } |
OLD | NEW |