blob: cea5edd8bab4ab12b283ae37bde389ae686dc5f5 [file] [log] [blame]
Paul Bakker367dae42009-06-28 21:50:27 +00001BEGIN_HEADER
2#include <polarssl/bignum.h>
3
4static int myrand( void *rng_state )
5{
6 if( rng_state != NULL )
7 rng_state = NULL;
8
9 return( rand() );
10}
11
12END_HEADER
13
14BEGIN_CASE
15mpi_read_write_string:radix_X:input_X:radix_A:input_A
16{
17 mpi X;
18 char str[1000];
19 int len = 1000;
20
21 mpi_init(&X, NULL);
22
23 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
24 TEST_ASSERT( mpi_write_string( &X, {radix_A}, str, &len ) == 0 );
25 TEST_ASSERT( strcmp( str, {input_A} ) == 0 );
26}
27END_CASE
28
29BEGIN_CASE
30mpi_gcd:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
31{
32 mpi A, X, Y, Z;
33 mpi_init(&A, &X, &Y, &Z, NULL);
34
35 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
36 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
37 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
38 TEST_ASSERT( mpi_gcd( &Z, &X, &Y ) == 0 );
39 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
40}
41END_CASE
42
43BEGIN_CASE
44mpi_cmp_int:input_X:input_A:result_CMP
45{
46 mpi X;
47 mpi_init(&X, NULL);
48
49 TEST_ASSERT( mpi_lset( &X, {input_X} ) == 0);
50 TEST_ASSERT( mpi_cmp_int( &X, {input_A} ) == {result_CMP});
51}
52END_CASE
53
54BEGIN_CASE
55mpi_cmp_mpi:radix_X:input_X:radix_Y:input_Y:input_A
56{
57 mpi X, Y;
58 mpi_init(&X, &Y, NULL);
59
60 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
61 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
62 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == {input_A} );
63}
64END_CASE
65
66BEGIN_CASE
67mpi_cmp_abs:radix_X:input_X:radix_Y:input_Y:input_A
68{
69 mpi X, Y;
70 mpi_init(&X, &Y, NULL);
71
72 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
73 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
74 TEST_ASSERT( mpi_cmp_abs( &X, &Y ) == {input_A} );
75}
76END_CASE
77
78BEGIN_CASE
79mpi_copy:input_X:input_A
80{
81 mpi X, Y, A;
82 mpi_init(&X, &Y, &A, NULL);
83
84 TEST_ASSERT( mpi_lset( &X, {input_X} ) == 0 );
85 TEST_ASSERT( mpi_lset( &Y, {input_A} ) == 0 );
86 TEST_ASSERT( mpi_lset( &A, {input_A} ) == 0 );
87 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
88 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) == 0 );
89 TEST_ASSERT( mpi_copy( &Y, &X ) == 0 );
90 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) == 0 );
91 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) != 0 );
92}
93END_CASE
94
95BEGIN_CASE
96mpi_swap:input_X:input_Y
97{
98 mpi X, Y, A;
99 mpi_init(&X, &Y, &A, NULL);
100
101 TEST_ASSERT( mpi_lset( &X, {input_X} ) == 0 );
102 TEST_ASSERT( mpi_lset( &Y, {input_Y} ) == 0 );
103 TEST_ASSERT( mpi_lset( &A, {input_X} ) == 0 );
104 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
105 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
106 mpi_swap( &X, &Y );
107 TEST_ASSERT( mpi_cmp_mpi( &X, &Y ) != 0 );
108 TEST_ASSERT( mpi_cmp_mpi( &Y, &A ) == 0 );
109}
110END_CASE
111
112BEGIN_CASE
113mpi_add_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
114{
115 mpi X, Y, Z, A;
116 mpi_init(&X, &Y, &Z, &A, NULL);
117
118 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
119 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
120 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
121 TEST_ASSERT( mpi_add_mpi( &Z, &X, &Y ) == 0 );
122 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
123}
124END_CASE
125
126BEGIN_CASE
127mpi_add_abs:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
128{
129 mpi X, Y, Z, A;
130 mpi_init(&X, &Y, &Z, &A, NULL);
131
132 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
133 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
134 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
135 TEST_ASSERT( mpi_add_abs( &Z, &X, &Y ) == 0 );
136 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
137}
138END_CASE
139
140BEGIN_CASE
141mpi_add_int:radix_X:input_X:input_Y:radix_A:input_A
142{
143 mpi X, Z, A;
144 mpi_init(&X, &Z, &A, NULL);
145
146 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
147 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
148 TEST_ASSERT( mpi_add_int( &Z, &X, {input_Y} ) == 0 );
149 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
150}
151END_CASE
152
153BEGIN_CASE
154mpi_sub_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
155{
156 mpi X, Y, Z, A;
157 mpi_init(&X, &Y, &Z, &A, NULL);
158
159 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
160 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
161 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
162 TEST_ASSERT( mpi_sub_mpi( &Z, &X, &Y ) == 0 );
163 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
164}
165END_CASE
166
167BEGIN_CASE
168mpi_sub_abs:radix_X:input_X:radix_Y:input_Y:radix_A:input_A:sub_result
169{
170 mpi X, Y, Z, A;
171 int res;
172 mpi_init(&X, &Y, &Z, &A, NULL);
173
174 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
175 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
176 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
177
178 res = mpi_sub_abs( &Z, &X, &Y );
179 TEST_ASSERT( res == {sub_result} );
180 if( res == 0 )
181 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
182}
183END_CASE
184
185BEGIN_CASE
186mpi_sub_int:radix_X:input_X:input_Y:radix_A:input_A
187{
188 mpi X, Z, A;
189 mpi_init(&X, &Z, &A, NULL);
190
191 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
192 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
193 TEST_ASSERT( mpi_sub_int( &Z, &X, {input_Y} ) == 0 );
194 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
195}
196END_CASE
197
198BEGIN_CASE
199mpi_mul_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A
200{
201 mpi X, Y, Z, A;
202 mpi_init(&X, &Y, &Z, &A, NULL);
203
204 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
205 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
206 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
207 TEST_ASSERT( mpi_mul_mpi( &Z, &X, &Y ) == 0 );
208 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
209}
210END_CASE
211
212BEGIN_CASE
213mpi_mul_int:radix_X:input_X:input_Y:radix_A:input_A:result_comparison
214{
215 mpi X, Z, A;
216 mpi_init(&X, &Z, &A, NULL);
217
218 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
219 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
220 TEST_ASSERT( mpi_mul_int( &Z, &X, {input_Y} ) == 0 );
221 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) {result_comparison} 0 );
222}
223END_CASE
224
225BEGIN_CASE
226mpi_div_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A:radix_B:input_B:div_result
227{
228 mpi X, Y, Q, R, A, B;
229 int res;
230 mpi_init(&X, &Y, &Q, &R, &A, &B, NULL);
231
232 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
233 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
234 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
235 TEST_ASSERT( mpi_read_string( &B, {radix_B}, {input_B} ) == 0 );
236 res = mpi_div_mpi( &Q, &R, &X, &Y );
237 TEST_ASSERT( res == {div_result} );
238 if( res == 0 )
239 {
240 TEST_ASSERT( mpi_cmp_mpi( &Q, &A ) == 0 );
241 TEST_ASSERT( mpi_cmp_mpi( &R, &B ) == 0 );
242 }
243}
244END_CASE
245
246BEGIN_CASE
247mpi_div_int:radix_X:input_X:input_Y:radix_A:input_A:radix_B:input_B:div_result
248{
249 mpi X, Q, R, A, B;
250 int res;
251 mpi_init(&X, &Q, &R, &A, &B, NULL);
252
253 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
254 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
255 TEST_ASSERT( mpi_read_string( &B, {radix_B}, {input_B} ) == 0 );
256 res = mpi_div_int( &Q, &R, &X, {input_Y} );
257 TEST_ASSERT( res == {div_result} );
258 if( res == 0 )
259 {
260 TEST_ASSERT( mpi_cmp_mpi( &Q, &A ) == 0 );
261 TEST_ASSERT( mpi_cmp_mpi( &R, &B ) == 0 );
262 }
263}
264END_CASE
265
266BEGIN_CASE
267mpi_mod_mpi:radix_X:input_X:radix_Y:input_Y:radix_A:input_A:div_result
268{
269 mpi X, Y, Z, A;
270 int res;
271 mpi_init(&X, &Y, &Z, &A, NULL);
272
273 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
274 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
275 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
276 res = mpi_mod_mpi( &Z, &X, &Y );
277 TEST_ASSERT( res == {div_result} );
278 if( res == 0 )
279 {
280 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
281 }
282}
283END_CASE
284
285BEGIN_CASE
286mpi_mod_int:radix_X:input_X:input_Y:input_A:div_result
287{
288 mpi X;
289 int res;
290 t_int r;
291 mpi_init(&X, NULL);
292
293 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
294 res = mpi_mod_int( &r, &X, {input_Y} );
295 TEST_ASSERT( res == {div_result} );
296 if( res == 0 )
297 {
298 TEST_ASSERT( r == {input_A} );
299 }
300}
301END_CASE
302
303BEGIN_CASE
304mpi_exp_mod:radix_A:input_A:radix_E:input_E:radix_N:input_N:radix_RR:input_RR:radix_X:input_X:div_result
305{
306 mpi A, E, N, RR, Z, X;
307 int res;
308 mpi_init(&A, &E, &N, &RR, &Z, &X, NULL);
309
310 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
311 TEST_ASSERT( mpi_read_string( &E, {radix_E}, {input_E} ) == 0 );
312 TEST_ASSERT( mpi_read_string( &N, {radix_N}, {input_N} ) == 0 );
313 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
314
315 if( strlen( {input_RR} ) )
316 TEST_ASSERT( mpi_read_string( &RR, {radix_RR}, {input_RR} ) == 0 );
317
318 res = mpi_exp_mod( &Z, &A, &E, &N, &RR );
319 TEST_ASSERT( res == {div_result} );
320 if( res == 0 )
321 {
322 TEST_ASSERT( mpi_cmp_mpi( &Z, &X ) == 0 );
323 }
324}
325END_CASE
326
327BEGIN_CASE
328mpi_inv_mod:radix_X:input_X:radix_Y:input_Y:radix_A:input_A:div_result
329{
330 mpi X, Y, Z, A;
331 int res;
332 mpi_init(&X, &Y, &Z, &A, NULL);
333
334 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
335 TEST_ASSERT( mpi_read_string( &Y, {radix_Y}, {input_Y} ) == 0 );
336 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
337 res = mpi_inv_mod( &Z, &X, &Y );
338 TEST_ASSERT( res == {div_result} );
339 if( res == 0 )
340 {
341 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
342 }
343}
344END_CASE
345
346BEGIN_CASE
347mpi_is_prime:radix_X:input_X:div_result
348{
349 mpi X;
350 int res;
351 mpi_init(&X, NULL);
352
353 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
354 res = mpi_is_prime( &X, myrand, NULL );
355 TEST_ASSERT( res == {div_result} );
356}
357END_CASE
358
359BEGIN_CASE
360mpi_shift_l:radix_X:input_X:shift_X:radix_A:input_A
361{
362 mpi X, A;
363 mpi_init(&X, &A, NULL);
364
365 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
366 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
367 TEST_ASSERT( mpi_shift_l( &X, {shift_X} ) == 0 );
368 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
369}
370END_CASE
371
372BEGIN_CASE
373mpi_shift_r:radix_X:input_X:shift_X:radix_A:input_A
374{
375 mpi X, A;
376 mpi_init(&X, &A, NULL);
377
378 TEST_ASSERT( mpi_read_string( &X, {radix_X}, {input_X} ) == 0 );
379 TEST_ASSERT( mpi_read_string( &A, {radix_A}, {input_A} ) == 0 );
380 TEST_ASSERT( mpi_shift_r( &X, {shift_X} ) == 0 );
381 TEST_ASSERT( mpi_cmp_mpi( &X, &A ) == 0 );
382}
383END_CASE
384
385/* Helper Code
386 char str[1000];
387 int len = 1000;
388 mpi_write_string(&Z, 10, str, &len);
389 printf("Z: %d %s\n", Z.s, str);
390 TEST_ASSERT( mpi_cmp_mpi( &Z, &A ) == 0 );
391*/