fix no-ssl build
[exim.git] / src / src / pdkim / bignum.c
1 /*
2 * Multi-precision integer library
3 *
4 * Copyright (C) 2006-2010, Brainspark B.V.
5 *
6 * This file is part of PolarSSL (http://www.polarssl.org)
7 * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
8 *
9 * All rights reserved.
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License along
22 * with this program; if not, write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 */
25 /*
26 * This MPI implementation is based on:
27 *
28 * http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf
29 * http://www.stillhq.com/extracted/gnupg-api/mpi/
30 * http://math.libtomcrypt.com/files/tommath.pdf
31 */
32
33 #include "polarssl/config.h"
34
35 #if defined(POLARSSL_BIGNUM_C)
36
37 #include "polarssl/bignum.h"
38 #include "polarssl/bn_mul.h"
39
40 #include <string.h>
41 #include <stdlib.h>
42 #include <stdarg.h>
43
44 #define ciL ((int) sizeof(t_int)) /* chars in limb */
45 #define biL (ciL << 3) /* bits in limb */
46 #define biH (ciL << 2) /* half limb size */
47
48 /*
49 * Convert between bits/chars and number of limbs
50 */
51 #define BITS_TO_LIMBS(i) (((i) + biL - 1) / biL)
52 #define CHARS_TO_LIMBS(i) (((i) + ciL - 1) / ciL)
53
54 /*
55 * Initialize one or more mpi
56 */
57 void mpi_init( mpi *X, ... )
58 {
59 va_list args;
60
61 va_start( args, X );
62
63 while( X != NULL )
64 {
65 X->s = 1;
66 X->n = 0;
67 X->p = NULL;
68
69 X = va_arg( args, mpi* );
70 }
71
72 va_end( args );
73 }
74
75 /*
76 * Unallocate one or more mpi
77 */
78 void mpi_free( mpi *X, ... )
79 {
80 va_list args;
81
82 va_start( args, X );
83
84 while( X != NULL )
85 {
86 if( X->p != NULL )
87 {
88 memset( X->p, 0, X->n * ciL );
89 free( X->p );
90 }
91
92 X->s = 1;
93 X->n = 0;
94 X->p = NULL;
95
96 X = va_arg( args, mpi* );
97 }
98
99 va_end( args );
100 }
101
102 /*
103 * Enlarge to the specified number of limbs
104 */
105 int mpi_grow( mpi *X, int nblimbs )
106 {
107 t_int *p;
108
109 if( X->n < nblimbs )
110 {
111 if( ( p = (t_int *) malloc( nblimbs * ciL ) ) == NULL )
112 return( 1 );
113
114 memset( p, 0, nblimbs * ciL );
115
116 if( X->p != NULL )
117 {
118 memcpy( p, X->p, X->n * ciL );
119 memset( X->p, 0, X->n * ciL );
120 free( X->p );
121 }
122
123 X->n = nblimbs;
124 X->p = p;
125 }
126
127 return( 0 );
128 }
129
130 /*
131 * Copy the contents of Y into X
132 */
133 int mpi_copy( mpi *X, const mpi *Y )
134 {
135 int ret, i;
136
137 if( X == Y )
138 return( 0 );
139
140 for( i = Y->n - 1; i > 0; i-- )
141 if( Y->p[i] != 0 )
142 break;
143 i++;
144
145 X->s = Y->s;
146
147 MPI_CHK( mpi_grow( X, i ) );
148
149 memset( X->p, 0, X->n * ciL );
150 memcpy( X->p, Y->p, i * ciL );
151
152 cleanup:
153
154 return( ret );
155 }
156
157 /*
158 * Swap the contents of X and Y
159 */
160 void mpi_swap( mpi *X, mpi *Y )
161 {
162 mpi T;
163
164 memcpy( &T, X, sizeof( mpi ) );
165 memcpy( X, Y, sizeof( mpi ) );
166 memcpy( Y, &T, sizeof( mpi ) );
167 }
168
169 /*
170 * Set value from integer
171 */
172 int mpi_lset( mpi *X, int z )
173 {
174 int ret;
175
176 MPI_CHK( mpi_grow( X, 1 ) );
177 memset( X->p, 0, X->n * ciL );
178
179 X->p[0] = ( z < 0 ) ? -z : z;
180 X->s = ( z < 0 ) ? -1 : 1;
181
182 cleanup:
183
184 return( ret );
185 }
186
187 /*
188 * Return the number of least significant bits
189 */
190 int mpi_lsb( const mpi *X )
191 {
192 int i, j, count = 0;
193
194 for( i = 0; i < X->n; i++ )
195 for( j = 0; j < (int) biL; j++, count++ )
196 if( ( ( X->p[i] >> j ) & 1 ) != 0 )
197 return( count );
198
199 return( 0 );
200 }
201
202 /*
203 * Return the number of most significant bits
204 */
205 int mpi_msb( const mpi *X )
206 {
207 int i, j;
208
209 for( i = X->n - 1; i > 0; i-- )
210 if( X->p[i] != 0 )
211 break;
212
213 for( j = biL - 1; j >= 0; j-- )
214 if( ( ( X->p[i] >> j ) & 1 ) != 0 )
215 break;
216
217 return( ( i * biL ) + j + 1 );
218 }
219
220 /*
221 * Return the total size in bytes
222 */
223 int mpi_size( const mpi *X )
224 {
225 return( ( mpi_msb( X ) + 7 ) >> 3 );
226 }
227
228 /*
229 * Convert an ASCII character to digit value
230 */
231 static int mpi_get_digit( t_int *d, int radix, char c )
232 {
233 *d = 255;
234
235 if( c >= 0x30 && c <= 0x39 ) *d = c - 0x30;
236 if( c >= 0x41 && c <= 0x46 ) *d = c - 0x37;
237 if( c >= 0x61 && c <= 0x66 ) *d = c - 0x57;
238
239 if( *d >= (t_int) radix )
240 return( POLARSSL_ERR_MPI_INVALID_CHARACTER );
241
242 return( 0 );
243 }
244
245 /*
246 * Import from an ASCII string
247 */
248 int mpi_read_string( mpi *X, int radix, const char *s )
249 {
250 int ret, i, j, n, slen;
251 t_int d;
252 mpi T;
253
254 if( radix < 2 || radix > 16 )
255 return( POLARSSL_ERR_MPI_BAD_INPUT_DATA );
256
257 mpi_init( &T, NULL );
258
259 slen = strlen( s );
260
261 if( radix == 16 )
262 {
263 n = BITS_TO_LIMBS( slen << 2 );
264
265 MPI_CHK( mpi_grow( X, n ) );
266 MPI_CHK( mpi_lset( X, 0 ) );
267
268 for( i = slen - 1, j = 0; i >= 0; i--, j++ )
269 {
270 if( i == 0 && s[i] == '-' )
271 {
272 X->s = -1;
273 break;
274 }
275
276 MPI_CHK( mpi_get_digit( &d, radix, s[i] ) );
277 X->p[j / (2 * ciL)] |= d << ( (j % (2 * ciL)) << 2 );
278 }
279 }
280 else
281 {
282 MPI_CHK( mpi_lset( X, 0 ) );
283
284 for( i = 0; i < slen; i++ )
285 {
286 if( i == 0 && s[i] == '-' )
287 {
288 X->s = -1;
289 continue;
290 }
291
292 MPI_CHK( mpi_get_digit( &d, radix, s[i] ) );
293 MPI_CHK( mpi_mul_int( &T, X, radix ) );
294
295 if( X->s == 1 )
296 {
297 MPI_CHK( mpi_add_int( X, &T, d ) );
298 }
299 else
300 {
301 MPI_CHK( mpi_sub_int( X, &T, d ) );
302 }
303 }
304 }
305
306 cleanup:
307
308 mpi_free( &T, NULL );
309
310 return( ret );
311 }
312
313 /*
314 * Helper to write the digits high-order first
315 */
316 static int mpi_write_hlp( mpi *X, int radix, char **p )
317 {
318 int ret;
319 t_int r;
320
321 if( radix < 2 || radix > 16 )
322 return( POLARSSL_ERR_MPI_BAD_INPUT_DATA );
323
324 MPI_CHK( mpi_mod_int( &r, X, radix ) );
325 MPI_CHK( mpi_div_int( X, NULL, X, radix ) );
326
327 if( mpi_cmp_int( X, 0 ) != 0 )
328 MPI_CHK( mpi_write_hlp( X, radix, p ) );
329
330 if( r < 10 )
331 *(*p)++ = (char)( r + 0x30 );
332 else
333 *(*p)++ = (char)( r + 0x37 );
334
335 cleanup:
336
337 return( ret );
338 }
339
340 /*
341 * Export into an ASCII string
342 */
343 int mpi_write_string( const mpi *X, int radix, char *s, int *slen )
344 {
345 int ret = 0, n;
346 char *p;
347 mpi T;
348
349 if( radix < 2 || radix > 16 )
350 return( POLARSSL_ERR_MPI_BAD_INPUT_DATA );
351
352 n = mpi_msb( X );
353 if( radix >= 4 ) n >>= 1;
354 if( radix >= 16 ) n >>= 1;
355 n += 3;
356
357 if( *slen < n )
358 {
359 *slen = n;
360 return( POLARSSL_ERR_MPI_BUFFER_TOO_SMALL );
361 }
362
363 p = s;
364 mpi_init( &T, NULL );
365
366 if( X->s == -1 )
367 *p++ = '-';
368
369 if( radix == 16 )
370 {
371 int c, i, j, k;
372
373 for( i = X->n - 1, k = 0; i >= 0; i-- )
374 {
375 for( j = ciL - 1; j >= 0; j-- )
376 {
377 c = ( X->p[i] >> (j << 3) ) & 0xFF;
378
379 if( c == 0 && k == 0 && (i + j) != 0 )
380 continue;
381
382 p += sprintf( p, "%02X", c );
383 k = 1;
384 }
385 }
386 }
387 else
388 {
389 MPI_CHK( mpi_copy( &T, X ) );
390
391 if( T.s == -1 )
392 T.s = 1;
393
394 MPI_CHK( mpi_write_hlp( &T, radix, &p ) );
395 }
396
397 *p++ = '\0';
398 *slen = p - s;
399
400 cleanup:
401
402 mpi_free( &T, NULL );
403
404 return( ret );
405 }
406
407 /*
408 * Read X from an opened file
409 */
410 int mpi_read_file( mpi *X, int radix, FILE *fin )
411 {
412 t_int d;
413 int slen;
414 char *p;
415 char s[1024];
416
417 memset( s, 0, sizeof( s ) );
418 if( fgets( s, sizeof( s ) - 1, fin ) == NULL )
419 return( POLARSSL_ERR_MPI_FILE_IO_ERROR );
420
421 slen = strlen( s );
422 if( s[slen - 1] == '\n' ) { slen--; s[slen] = '\0'; }
423 if( s[slen - 1] == '\r' ) { slen--; s[slen] = '\0'; }
424
425 p = s + slen;
426 while( --p >= s )
427 if( mpi_get_digit( &d, radix, *p ) != 0 )
428 break;
429
430 return( mpi_read_string( X, radix, p + 1 ) );
431 }
432
433 /*
434 * Write X into an opened file (or stdout if fout == NULL)
435 */
436 int mpi_write_file( const char *p, const mpi *X, int radix, FILE *fout )
437 {
438 int n, ret;
439 size_t slen;
440 size_t plen;
441 char s[2048];
442
443 n = sizeof( s );
444 memset( s, 0, n );
445 n -= 2;
446
447 MPI_CHK( mpi_write_string( X, radix, s, (int *) &n ) );
448
449 if( p == NULL ) p = "";
450
451 plen = strlen( p );
452 slen = strlen( s );
453 s[slen++] = '\r';
454 s[slen++] = '\n';
455
456 if( fout != NULL )
457 {
458 if( fwrite( p, 1, plen, fout ) != plen ||
459 fwrite( s, 1, slen, fout ) != slen )
460 return( POLARSSL_ERR_MPI_FILE_IO_ERROR );
461 }
462 else
463 printf( "%s%s", p, s );
464
465 cleanup:
466
467 return( ret );
468 }
469
470 /*
471 * Import X from unsigned binary data, big endian
472 */
473 int mpi_read_binary( mpi *X, const unsigned char *buf, int buflen )
474 {
475 int ret, i, j, n;
476
477 for( n = 0; n < buflen; n++ )
478 if( buf[n] != 0 )
479 break;
480
481 MPI_CHK( mpi_grow( X, CHARS_TO_LIMBS( buflen - n ) ) );
482 MPI_CHK( mpi_lset( X, 0 ) );
483
484 for( i = buflen - 1, j = 0; i >= n; i--, j++ )
485 X->p[j / ciL] |= ((t_int) buf[i]) << ((j % ciL) << 3);
486
487 cleanup:
488
489 return( ret );
490 }
491
492 /*
493 * Export X into unsigned binary data, big endian
494 */
495 int mpi_write_binary( const mpi *X, unsigned char *buf, int buflen )
496 {
497 int i, j, n;
498
499 n = mpi_size( X );
500
501 if( buflen < n )
502 return( POLARSSL_ERR_MPI_BUFFER_TOO_SMALL );
503
504 memset( buf, 0, buflen );
505
506 for( i = buflen - 1, j = 0; n > 0; i--, j++, n-- )
507 buf[i] = (unsigned char)( X->p[j / ciL] >> ((j % ciL) << 3) );
508
509 return( 0 );
510 }
511
512 /*
513 * Left-shift: X <<= count
514 */
515 int mpi_shift_l( mpi *X, int count )
516 {
517 int ret, i, v0, t1;
518 t_int r0 = 0, r1;
519
520 v0 = count / (biL );
521 t1 = count & (biL - 1);
522
523 i = mpi_msb( X ) + count;
524
525 if( X->n * (int) biL < i )
526 MPI_CHK( mpi_grow( X, BITS_TO_LIMBS( i ) ) );
527
528 ret = 0;
529
530 /*
531 * shift by count / limb_size
532 */
533 if( v0 > 0 )
534 {
535 for( i = X->n - 1; i >= v0; i-- )
536 X->p[i] = X->p[i - v0];
537
538 for( ; i >= 0; i-- )
539 X->p[i] = 0;
540 }
541
542 /*
543 * shift by count % limb_size
544 */
545 if( t1 > 0 )
546 {
547 for( i = v0; i < X->n; i++ )
548 {
549 r1 = X->p[i] >> (biL - t1);
550 X->p[i] <<= t1;
551 X->p[i] |= r0;
552 r0 = r1;
553 }
554 }
555
556 cleanup:
557
558 return( ret );
559 }
560
561 /*
562 * Right-shift: X >>= count
563 */
564 int mpi_shift_r( mpi *X, int count )
565 {
566 int i, v0, v1;
567 t_int r0 = 0, r1;
568
569 v0 = count / biL;
570 v1 = count & (biL - 1);
571
572 /*
573 * shift by count / limb_size
574 */
575 if( v0 > 0 )
576 {
577 for( i = 0; i < X->n - v0; i++ )
578 X->p[i] = X->p[i + v0];
579
580 for( ; i < X->n; i++ )
581 X->p[i] = 0;
582 }
583
584 /*
585 * shift by count % limb_size
586 */
587 if( v1 > 0 )
588 {
589 for( i = X->n - 1; i >= 0; i-- )
590 {
591 r1 = X->p[i] << (biL - v1);
592 X->p[i] >>= v1;
593 X->p[i] |= r0;
594 r0 = r1;
595 }
596 }
597
598 return( 0 );
599 }
600
601 /*
602 * Compare unsigned values
603 */
604 int mpi_cmp_abs( const mpi *X, const mpi *Y )
605 {
606 int i, j;
607
608 for( i = X->n - 1; i >= 0; i-- )
609 if( X->p[i] != 0 )
610 break;
611
612 for( j = Y->n - 1; j >= 0; j-- )
613 if( Y->p[j] != 0 )
614 break;
615
616 if( i < 0 && j < 0 )
617 return( 0 );
618
619 if( i > j ) return( 1 );
620 if( j > i ) return( -1 );
621
622 for( ; i >= 0; i-- )
623 {
624 if( X->p[i] > Y->p[i] ) return( 1 );
625 if( X->p[i] < Y->p[i] ) return( -1 );
626 }
627
628 return( 0 );
629 }
630
631 /*
632 * Compare signed values
633 */
634 int mpi_cmp_mpi( const mpi *X, const mpi *Y )
635 {
636 int i, j;
637
638 for( i = X->n - 1; i >= 0; i-- )
639 if( X->p[i] != 0 )
640 break;
641
642 for( j = Y->n - 1; j >= 0; j-- )
643 if( Y->p[j] != 0 )
644 break;
645
646 if( i < 0 && j < 0 )
647 return( 0 );
648
649 if( i > j ) return( X->s );
650 if( j > i ) return( -X->s );
651
652 if( X->s > 0 && Y->s < 0 ) return( 1 );
653 if( Y->s > 0 && X->s < 0 ) return( -1 );
654
655 for( ; i >= 0; i-- )
656 {
657 if( X->p[i] > Y->p[i] ) return( X->s );
658 if( X->p[i] < Y->p[i] ) return( -X->s );
659 }
660
661 return( 0 );
662 }
663
664 /*
665 * Compare signed values
666 */
667 int mpi_cmp_int( const mpi *X, int z )
668 {
669 mpi Y;
670 t_int p[1];
671
672 *p = ( z < 0 ) ? -z : z;
673 Y.s = ( z < 0 ) ? -1 : 1;
674 Y.n = 1;
675 Y.p = p;
676
677 return( mpi_cmp_mpi( X, &Y ) );
678 }
679
680 /*
681 * Unsigned addition: X = |A| + |B| (HAC 14.7)
682 */
683 int mpi_add_abs( mpi *X, const mpi *A, const mpi *B )
684 {
685 int ret, i, j;
686 t_int *o, *p, c;
687
688 if( X == B )
689 {
690 const mpi *T = A; A = X; B = T;
691 }
692
693 if( X != A )
694 MPI_CHK( mpi_copy( X, A ) );
695
696 /*
697 * X should always be positive as a result of unsigned additions.
698 */
699 X->s = 1;
700
701 for( j = B->n - 1; j >= 0; j-- )
702 if( B->p[j] != 0 )
703 break;
704
705 MPI_CHK( mpi_grow( X, j + 1 ) );
706
707 o = B->p; p = X->p; c = 0;
708
709 for( i = 0; i <= j; i++, o++, p++ )
710 {
711 *p += c; c = ( *p < c );
712 *p += *o; c += ( *p < *o );
713 }
714
715 while( c != 0 )
716 {
717 if( i >= X->n )
718 {
719 MPI_CHK( mpi_grow( X, i + 1 ) );
720 p = X->p + i;
721 }
722
723 *p += c; c = ( *p < c ); i++;
724 }
725
726 cleanup:
727
728 return( ret );
729 }
730
731 /*
732 * Helper for mpi substraction
733 */
734 static void mpi_sub_hlp( int n, t_int *s, t_int *d )
735 {
736 int i;
737 t_int c, z;
738
739 for( i = c = 0; i < n; i++, s++, d++ )
740 {
741 z = ( *d < c ); *d -= c;
742 c = ( *d < *s ) + z; *d -= *s;
743 }
744
745 while( c != 0 )
746 {
747 z = ( *d < c ); *d -= c;
748 c = z; i++; d++;
749 }
750 }
751
752 /*
753 * Unsigned substraction: X = |A| - |B| (HAC 14.9)
754 */
755 int mpi_sub_abs( mpi *X, const mpi *A, const mpi *B )
756 {
757 mpi TB;
758 int ret, n;
759
760 if( mpi_cmp_abs( A, B ) < 0 )
761 return( POLARSSL_ERR_MPI_NEGATIVE_VALUE );
762
763 mpi_init( &TB, NULL );
764
765 if( X == B )
766 {
767 MPI_CHK( mpi_copy( &TB, B ) );
768 B = &TB;
769 }
770
771 if( X != A )
772 MPI_CHK( mpi_copy( X, A ) );
773
774 /*
775 * X should always be positive as a result of unsigned substractions.
776 */
777 X->s = 1;
778
779 ret = 0;
780
781 for( n = B->n - 1; n >= 0; n-- )
782 if( B->p[n] != 0 )
783 break;
784
785 mpi_sub_hlp( n + 1, B->p, X->p );
786
787 cleanup:
788
789 mpi_free( &TB, NULL );
790
791 return( ret );
792 }
793
794 /*
795 * Signed addition: X = A + B
796 */
797 int mpi_add_mpi( mpi *X, const mpi *A, const mpi *B )
798 {
799 int ret, s = A->s;
800
801 if( A->s * B->s < 0 )
802 {
803 if( mpi_cmp_abs( A, B ) >= 0 )
804 {
805 MPI_CHK( mpi_sub_abs( X, A, B ) );
806 X->s = s;
807 }
808 else
809 {
810 MPI_CHK( mpi_sub_abs( X, B, A ) );
811 X->s = -s;
812 }
813 }
814 else
815 {
816 MPI_CHK( mpi_add_abs( X, A, B ) );
817 X->s = s;
818 }
819
820 cleanup:
821
822 return( ret );
823 }
824
825 /*
826 * Signed substraction: X = A - B
827 */
828 int mpi_sub_mpi( mpi *X, const mpi *A, const mpi *B )
829 {
830 int ret, s = A->s;
831
832 if( A->s * B->s > 0 )
833 {
834 if( mpi_cmp_abs( A, B ) >= 0 )
835 {
836 MPI_CHK( mpi_sub_abs( X, A, B ) );
837 X->s = s;
838 }
839 else
840 {
841 MPI_CHK( mpi_sub_abs( X, B, A ) );
842 X->s = -s;
843 }
844 }
845 else
846 {
847 MPI_CHK( mpi_add_abs( X, A, B ) );
848 X->s = s;
849 }
850
851 cleanup:
852
853 return( ret );
854 }
855
856 /*
857 * Signed addition: X = A + b
858 */
859 int mpi_add_int( mpi *X, const mpi *A, int b )
860 {
861 mpi _B;
862 t_int p[1];
863
864 p[0] = ( b < 0 ) ? -b : b;
865 _B.s = ( b < 0 ) ? -1 : 1;
866 _B.n = 1;
867 _B.p = p;
868
869 return( mpi_add_mpi( X, A, &_B ) );
870 }
871
872 /*
873 * Signed substraction: X = A - b
874 */
875 int mpi_sub_int( mpi *X, const mpi *A, int b )
876 {
877 mpi _B;
878 t_int p[1];
879
880 p[0] = ( b < 0 ) ? -b : b;
881 _B.s = ( b < 0 ) ? -1 : 1;
882 _B.n = 1;
883 _B.p = p;
884
885 return( mpi_sub_mpi( X, A, &_B ) );
886 }
887
888 /*
889 * Helper for mpi multiplication
890 */
891 static void mpi_mul_hlp( int i, t_int *s, t_int *d, t_int b )
892 {
893 t_int c = 0, t = 0;
894
895 #if defined(MULADDC_HUIT)
896 for( ; i >= 8; i -= 8 )
897 {
898 MULADDC_INIT
899 MULADDC_HUIT
900 MULADDC_STOP
901 }
902
903 for( ; i > 0; i-- )
904 {
905 MULADDC_INIT
906 MULADDC_CORE
907 MULADDC_STOP
908 }
909 #else
910 for( ; i >= 16; i -= 16 )
911 {
912 MULADDC_INIT
913 MULADDC_CORE MULADDC_CORE
914 MULADDC_CORE MULADDC_CORE
915 MULADDC_CORE MULADDC_CORE
916 MULADDC_CORE MULADDC_CORE
917
918 MULADDC_CORE MULADDC_CORE
919 MULADDC_CORE MULADDC_CORE
920 MULADDC_CORE MULADDC_CORE
921 MULADDC_CORE MULADDC_CORE
922 MULADDC_STOP
923 }
924
925 for( ; i >= 8; i -= 8 )
926 {
927 MULADDC_INIT
928 MULADDC_CORE MULADDC_CORE
929 MULADDC_CORE MULADDC_CORE
930
931 MULADDC_CORE MULADDC_CORE
932 MULADDC_CORE MULADDC_CORE
933 MULADDC_STOP
934 }
935
936 for( ; i > 0; i-- )
937 {
938 MULADDC_INIT
939 MULADDC_CORE
940 MULADDC_STOP
941 }
942 #endif
943
944 t++;
945
946 do {
947 *d += c; c = ( *d < c ); d++;
948 }
949 while( c != 0 );
950 }
951
952 /*
953 * Baseline multiplication: X = A * B (HAC 14.12)
954 */
955 int mpi_mul_mpi( mpi *X, const mpi *A, const mpi *B )
956 {
957 int ret, i, j;
958 mpi TA, TB;
959
960 mpi_init( &TA, &TB, NULL );
961
962 if( X == A ) { MPI_CHK( mpi_copy( &TA, A ) ); A = &TA; }
963 if( X == B ) { MPI_CHK( mpi_copy( &TB, B ) ); B = &TB; }
964
965 for( i = A->n - 1; i >= 0; i-- )
966 if( A->p[i] != 0 )
967 break;
968
969 for( j = B->n - 1; j >= 0; j-- )
970 if( B->p[j] != 0 )
971 break;
972
973 MPI_CHK( mpi_grow( X, i + j + 2 ) );
974 MPI_CHK( mpi_lset( X, 0 ) );
975
976 for( i++; j >= 0; j-- )
977 mpi_mul_hlp( i, A->p, X->p + j, B->p[j] );
978
979 X->s = A->s * B->s;
980
981 cleanup:
982
983 mpi_free( &TB, &TA, NULL );
984
985 return( ret );
986 }
987
988 /*
989 * Baseline multiplication: X = A * b
990 */
991 int mpi_mul_int( mpi *X, const mpi *A, t_int b )
992 {
993 mpi _B;
994 t_int p[1];
995
996 _B.s = 1;
997 _B.n = 1;
998 _B.p = p;
999 p[0] = b;
1000
1001 return( mpi_mul_mpi( X, A, &_B ) );
1002 }
1003
1004 /*
1005 * Division by mpi: A = Q * B + R (HAC 14.20)
1006 */
1007 int mpi_div_mpi( mpi *Q, mpi *R, const mpi *A, const mpi *B )
1008 {
1009 int ret, i, n, t, k;
1010 mpi X, Y, Z, T1, T2;
1011
1012 if( mpi_cmp_int( B, 0 ) == 0 )
1013 return( POLARSSL_ERR_MPI_DIVISION_BY_ZERO );
1014
1015 mpi_init( &X, &Y, &Z, &T1, &T2, NULL );
1016
1017 if( mpi_cmp_abs( A, B ) < 0 )
1018 {
1019 if( Q != NULL ) MPI_CHK( mpi_lset( Q, 0 ) );
1020 if( R != NULL ) MPI_CHK( mpi_copy( R, A ) );
1021 return( 0 );
1022 }
1023
1024 MPI_CHK( mpi_copy( &X, A ) );
1025 MPI_CHK( mpi_copy( &Y, B ) );
1026 X.s = Y.s = 1;
1027
1028 MPI_CHK( mpi_grow( &Z, A->n + 2 ) );
1029 MPI_CHK( mpi_lset( &Z, 0 ) );
1030 MPI_CHK( mpi_grow( &T1, 2 ) );
1031 MPI_CHK( mpi_grow( &T2, 3 ) );
1032
1033 k = mpi_msb( &Y ) % biL;
1034 if( k < (int) biL - 1 )
1035 {
1036 k = biL - 1 - k;
1037 MPI_CHK( mpi_shift_l( &X, k ) );
1038 MPI_CHK( mpi_shift_l( &Y, k ) );
1039 }
1040 else k = 0;
1041
1042 n = X.n - 1;
1043 t = Y.n - 1;
1044 mpi_shift_l( &Y, biL * (n - t) );
1045
1046 while( mpi_cmp_mpi( &X, &Y ) >= 0 )
1047 {
1048 Z.p[n - t]++;
1049 mpi_sub_mpi( &X, &X, &Y );
1050 }
1051 mpi_shift_r( &Y, biL * (n - t) );
1052
1053 for( i = n; i > t ; i-- )
1054 {
1055 if( X.p[i] >= Y.p[t] )
1056 Z.p[i - t - 1] = ~0;
1057 else
1058 {
1059 #if defined(POLARSSL_HAVE_LONGLONG)
1060 t_dbl r;
1061
1062 r = (t_dbl) X.p[i] << biL;
1063 r |= (t_dbl) X.p[i - 1];
1064 r /= Y.p[t];
1065 if( r > ((t_dbl) 1 << biL) - 1)
1066 r = ((t_dbl) 1 << biL) - 1;
1067
1068 Z.p[i - t - 1] = (t_int) r;
1069 #else
1070 /*
1071 * __udiv_qrnnd_c, from gmp/longlong.h
1072 */
1073 t_int q0, q1, r0, r1;
1074 t_int d0, d1, d, m;
1075
1076 d = Y.p[t];
1077 d0 = ( d << biH ) >> biH;
1078 d1 = ( d >> biH );
1079
1080 q1 = X.p[i] / d1;
1081 r1 = X.p[i] - d1 * q1;
1082 r1 <<= biH;
1083 r1 |= ( X.p[i - 1] >> biH );
1084
1085 m = q1 * d0;
1086 if( r1 < m )
1087 {
1088 q1--, r1 += d;
1089 while( r1 >= d && r1 < m )
1090 q1--, r1 += d;
1091 }
1092 r1 -= m;
1093
1094 q0 = r1 / d1;
1095 r0 = r1 - d1 * q0;
1096 r0 <<= biH;
1097 r0 |= ( X.p[i - 1] << biH ) >> biH;
1098
1099 m = q0 * d0;
1100 if( r0 < m )
1101 {
1102 q0--, r0 += d;
1103 while( r0 >= d && r0 < m )
1104 q0--, r0 += d;
1105 }
1106 r0 -= m;
1107
1108 Z.p[i - t - 1] = ( q1 << biH ) | q0;
1109 #endif
1110 }
1111
1112 Z.p[i - t - 1]++;
1113 do
1114 {
1115 Z.p[i - t - 1]--;
1116
1117 MPI_CHK( mpi_lset( &T1, 0 ) );
1118 T1.p[0] = (t < 1) ? 0 : Y.p[t - 1];
1119 T1.p[1] = Y.p[t];
1120 MPI_CHK( mpi_mul_int( &T1, &T1, Z.p[i - t - 1] ) );
1121
1122 MPI_CHK( mpi_lset( &T2, 0 ) );
1123 T2.p[0] = (i < 2) ? 0 : X.p[i - 2];
1124 T2.p[1] = (i < 1) ? 0 : X.p[i - 1];
1125 T2.p[2] = X.p[i];
1126 }
1127 while( mpi_cmp_mpi( &T1, &T2 ) > 0 );
1128
1129 MPI_CHK( mpi_mul_int( &T1, &Y, Z.p[i - t - 1] ) );
1130 MPI_CHK( mpi_shift_l( &T1, biL * (i - t - 1) ) );
1131 MPI_CHK( mpi_sub_mpi( &X, &X, &T1 ) );
1132
1133 if( mpi_cmp_int( &X, 0 ) < 0 )
1134 {
1135 MPI_CHK( mpi_copy( &T1, &Y ) );
1136 MPI_CHK( mpi_shift_l( &T1, biL * (i - t - 1) ) );
1137 MPI_CHK( mpi_add_mpi( &X, &X, &T1 ) );
1138 Z.p[i - t - 1]--;
1139 }
1140 }
1141
1142 if( Q != NULL )
1143 {
1144 mpi_copy( Q, &Z );
1145 Q->s = A->s * B->s;
1146 }
1147
1148 if( R != NULL )
1149 {
1150 mpi_shift_r( &X, k );
1151 mpi_copy( R, &X );
1152
1153 R->s = A->s;
1154 if( mpi_cmp_int( R, 0 ) == 0 )
1155 R->s = 1;
1156 }
1157
1158 cleanup:
1159
1160 mpi_free( &X, &Y, &Z, &T1, &T2, NULL );
1161
1162 return( ret );
1163 }
1164
1165 /*
1166 * Division by int: A = Q * b + R
1167 *
1168 * Returns 0 if successful
1169 * 1 if memory allocation failed
1170 * POLARSSL_ERR_MPI_DIVISION_BY_ZERO if b == 0
1171 */
1172 int mpi_div_int( mpi *Q, mpi *R, const mpi *A, int b )
1173 {
1174 mpi _B;
1175 t_int p[1];
1176
1177 p[0] = ( b < 0 ) ? -b : b;
1178 _B.s = ( b < 0 ) ? -1 : 1;
1179 _B.n = 1;
1180 _B.p = p;
1181
1182 return( mpi_div_mpi( Q, R, A, &_B ) );
1183 }
1184
1185 /*
1186 * Modulo: R = A mod B
1187 */
1188 int mpi_mod_mpi( mpi *R, const mpi *A, const mpi *B )
1189 {
1190 int ret;
1191
1192 if( mpi_cmp_int( B, 0 ) < 0 )
1193 return POLARSSL_ERR_MPI_NEGATIVE_VALUE;
1194
1195 MPI_CHK( mpi_div_mpi( NULL, R, A, B ) );
1196
1197 while( mpi_cmp_int( R, 0 ) < 0 )
1198 MPI_CHK( mpi_add_mpi( R, R, B ) );
1199
1200 while( mpi_cmp_mpi( R, B ) >= 0 )
1201 MPI_CHK( mpi_sub_mpi( R, R, B ) );
1202
1203 cleanup:
1204
1205 return( ret );
1206 }
1207
1208 /*
1209 * Modulo: r = A mod b
1210 */
1211 int mpi_mod_int( t_int *r, const mpi *A, int b )
1212 {
1213 int i;
1214 t_int x, y, z;
1215
1216 if( b == 0 )
1217 return( POLARSSL_ERR_MPI_DIVISION_BY_ZERO );
1218
1219 if( b < 0 )
1220 return POLARSSL_ERR_MPI_NEGATIVE_VALUE;
1221
1222 /*
1223 * handle trivial cases
1224 */
1225 if( b == 1 )
1226 {
1227 *r = 0;
1228 return( 0 );
1229 }
1230
1231 if( b == 2 )
1232 {
1233 *r = A->p[0] & 1;
1234 return( 0 );
1235 }
1236
1237 /*
1238 * general case
1239 */
1240 for( i = A->n - 1, y = 0; i >= 0; i-- )
1241 {
1242 x = A->p[i];
1243 y = ( y << biH ) | ( x >> biH );
1244 z = y / b;
1245 y -= z * b;
1246
1247 x <<= biH;
1248 y = ( y << biH ) | ( x >> biH );
1249 z = y / b;
1250 y -= z * b;
1251 }
1252
1253 /*
1254 * If A is negative, then the current y represents a negative value.
1255 * Flipping it to the positive side.
1256 */
1257 if( A->s < 0 && y != 0 )
1258 y = b - y;
1259
1260 *r = y;
1261
1262 return( 0 );
1263 }
1264
1265 /*
1266 * Fast Montgomery initialization (thanks to Tom St Denis)
1267 */
1268 static void mpi_montg_init( t_int *mm, const mpi *N )
1269 {
1270 t_int x, m0 = N->p[0];
1271
1272 x = m0;
1273 x += ( ( m0 + 2 ) & 4 ) << 1;
1274 x *= ( 2 - ( m0 * x ) );
1275
1276 if( biL >= 16 ) x *= ( 2 - ( m0 * x ) );
1277 if( biL >= 32 ) x *= ( 2 - ( m0 * x ) );
1278 if( biL >= 64 ) x *= ( 2 - ( m0 * x ) );
1279
1280 *mm = ~x + 1;
1281 }
1282
1283 /*
1284 * Montgomery multiplication: A = A * B * R^-1 mod N (HAC 14.36)
1285 */
1286 static void mpi_montmul( mpi *A, const mpi *B, const mpi *N, t_int mm, const mpi *T )
1287 {
1288 int i, n, m;
1289 t_int u0, u1, *d;
1290
1291 memset( T->p, 0, T->n * ciL );
1292
1293 d = T->p;
1294 n = N->n;
1295 m = ( B->n < n ) ? B->n : n;
1296
1297 for( i = 0; i < n; i++ )
1298 {
1299 /*
1300 * T = (T + u0*B + u1*N) / 2^biL
1301 */
1302 u0 = A->p[i];
1303 u1 = ( d[0] + u0 * B->p[0] ) * mm;
1304
1305 mpi_mul_hlp( m, B->p, d, u0 );
1306 mpi_mul_hlp( n, N->p, d, u1 );
1307
1308 *d++ = u0; d[n + 1] = 0;
1309 }
1310
1311 memcpy( A->p, d, (n + 1) * ciL );
1312
1313 if( mpi_cmp_abs( A, N ) >= 0 )
1314 mpi_sub_hlp( n, N->p, A->p );
1315 else
1316 /* prevent timing attacks */
1317 mpi_sub_hlp( n, A->p, T->p );
1318 }
1319
1320 /*
1321 * Montgomery reduction: A = A * R^-1 mod N
1322 */
1323 static void mpi_montred( mpi *A, const mpi *N, t_int mm, const mpi *T )
1324 {
1325 t_int z = 1;
1326 mpi U;
1327
1328 U.n = U.s = z;
1329 U.p = &z;
1330
1331 mpi_montmul( A, &U, N, mm, T );
1332 }
1333
1334 /*
1335 * Sliding-window exponentiation: X = A^E mod N (HAC 14.85)
1336 */
1337 int mpi_exp_mod( mpi *X, const mpi *A, const mpi *E, const mpi *N, mpi *_RR )
1338 {
1339 int ret, i, j, wsize, wbits;
1340 int bufsize, nblimbs, nbits;
1341 t_int ei, mm, state;
1342 mpi RR, T, W[64];
1343
1344 if( mpi_cmp_int( N, 0 ) < 0 || ( N->p[0] & 1 ) == 0 )
1345 return( POLARSSL_ERR_MPI_BAD_INPUT_DATA );
1346
1347 /*
1348 * Init temps and window size
1349 */
1350 mpi_montg_init( &mm, N );
1351 mpi_init( &RR, &T, NULL );
1352 memset( W, 0, sizeof( W ) );
1353
1354 i = mpi_msb( E );
1355
1356 wsize = ( i > 671 ) ? 6 : ( i > 239 ) ? 5 :
1357 ( i > 79 ) ? 4 : ( i > 23 ) ? 3 : 1;
1358
1359 j = N->n + 1;
1360 MPI_CHK( mpi_grow( X, j ) );
1361 MPI_CHK( mpi_grow( &W[1], j ) );
1362 MPI_CHK( mpi_grow( &T, j * 2 ) );
1363
1364 /*
1365 * If 1st call, pre-compute R^2 mod N
1366 */
1367 if( _RR == NULL || _RR->p == NULL )
1368 {
1369 MPI_CHK( mpi_lset( &RR, 1 ) );
1370 MPI_CHK( mpi_shift_l( &RR, N->n * 2 * biL ) );
1371 MPI_CHK( mpi_mod_mpi( &RR, &RR, N ) );
1372
1373 if( _RR != NULL )
1374 memcpy( _RR, &RR, sizeof( mpi ) );
1375 }
1376 else
1377 memcpy( &RR, _RR, sizeof( mpi ) );
1378
1379 /*
1380 * W[1] = A * R^2 * R^-1 mod N = A * R mod N
1381 */
1382 if( mpi_cmp_mpi( A, N ) >= 0 )
1383 mpi_mod_mpi( &W[1], A, N );
1384 else mpi_copy( &W[1], A );
1385
1386 mpi_montmul( &W[1], &RR, N, mm, &T );
1387
1388 /*
1389 * X = R^2 * R^-1 mod N = R mod N
1390 */
1391 MPI_CHK( mpi_copy( X, &RR ) );
1392 mpi_montred( X, N, mm, &T );
1393
1394 if( wsize > 1 )
1395 {
1396 /*
1397 * W[1 << (wsize - 1)] = W[1] ^ (wsize - 1)
1398 */
1399 j = 1 << (wsize - 1);
1400
1401 MPI_CHK( mpi_grow( &W[j], N->n + 1 ) );
1402 MPI_CHK( mpi_copy( &W[j], &W[1] ) );
1403
1404 for( i = 0; i < wsize - 1; i++ )
1405 mpi_montmul( &W[j], &W[j], N, mm, &T );
1406
1407 /*
1408 * W[i] = W[i - 1] * W[1]
1409 */
1410 for( i = j + 1; i < (1 << wsize); i++ )
1411 {
1412 MPI_CHK( mpi_grow( &W[i], N->n + 1 ) );
1413 MPI_CHK( mpi_copy( &W[i], &W[i - 1] ) );
1414
1415 mpi_montmul( &W[i], &W[1], N, mm, &T );
1416 }
1417 }
1418
1419 nblimbs = E->n;
1420 bufsize = 0;
1421 nbits = 0;
1422 wbits = 0;
1423 state = 0;
1424
1425 while( 1 )
1426 {
1427 if( bufsize == 0 )
1428 {
1429 if( nblimbs-- == 0 )
1430 break;
1431
1432 bufsize = sizeof( t_int ) << 3;
1433 }
1434
1435 bufsize--;
1436
1437 ei = (E->p[nblimbs] >> bufsize) & 1;
1438
1439 /*
1440 * skip leading 0s
1441 */
1442 if( ei == 0 && state == 0 )
1443 continue;
1444
1445 if( ei == 0 && state == 1 )
1446 {
1447 /*
1448 * out of window, square X
1449 */
1450 mpi_montmul( X, X, N, mm, &T );
1451 continue;
1452 }
1453
1454 /*
1455 * add ei to current window
1456 */
1457 state = 2;
1458
1459 nbits++;
1460 wbits |= (ei << (wsize - nbits));
1461
1462 if( nbits == wsize )
1463 {
1464 /*
1465 * X = X^wsize R^-1 mod N
1466 */
1467 for( i = 0; i < wsize; i++ )
1468 mpi_montmul( X, X, N, mm, &T );
1469
1470 /*
1471 * X = X * W[wbits] R^-1 mod N
1472 */
1473 mpi_montmul( X, &W[wbits], N, mm, &T );
1474
1475 state--;
1476 nbits = 0;
1477 wbits = 0;
1478 }
1479 }
1480
1481 /*
1482 * process the remaining bits
1483 */
1484 for( i = 0; i < nbits; i++ )
1485 {
1486 mpi_montmul( X, X, N, mm, &T );
1487
1488 wbits <<= 1;
1489
1490 if( (wbits & (1 << wsize)) != 0 )
1491 mpi_montmul( X, &W[1], N, mm, &T );
1492 }
1493
1494 /*
1495 * X = A^E * R * R^-1 mod N = A^E mod N
1496 */
1497 mpi_montred( X, N, mm, &T );
1498
1499 cleanup:
1500
1501 for( i = (1 << (wsize - 1)); i < (1 << wsize); i++ )
1502 mpi_free( &W[i], NULL );
1503
1504 if( _RR != NULL )
1505 mpi_free( &W[1], &T, NULL );
1506 else mpi_free( &W[1], &T, &RR, NULL );
1507
1508 return( ret );
1509 }
1510
1511 /*
1512 * Greatest common divisor: G = gcd(A, B) (HAC 14.54)
1513 */
1514 int mpi_gcd( mpi *G, const mpi *A, const mpi *B )
1515 {
1516 int ret, lz, lzt;
1517 mpi TG, TA, TB;
1518
1519 mpi_init( &TG, &TA, &TB, NULL );
1520
1521 MPI_CHK( mpi_copy( &TA, A ) );
1522 MPI_CHK( mpi_copy( &TB, B ) );
1523
1524 lz = mpi_lsb( &TA );
1525 lzt = mpi_lsb( &TB );
1526
1527 if ( lzt < lz )
1528 lz = lzt;
1529
1530 MPI_CHK( mpi_shift_r( &TA, lz ) );
1531 MPI_CHK( mpi_shift_r( &TB, lz ) );
1532
1533 TA.s = TB.s = 1;
1534
1535 while( mpi_cmp_int( &TA, 0 ) != 0 )
1536 {
1537 MPI_CHK( mpi_shift_r( &TA, mpi_lsb( &TA ) ) );
1538 MPI_CHK( mpi_shift_r( &TB, mpi_lsb( &TB ) ) );
1539
1540 if( mpi_cmp_mpi( &TA, &TB ) >= 0 )
1541 {
1542 MPI_CHK( mpi_sub_abs( &TA, &TA, &TB ) );
1543 MPI_CHK( mpi_shift_r( &TA, 1 ) );
1544 }
1545 else
1546 {
1547 MPI_CHK( mpi_sub_abs( &TB, &TB, &TA ) );
1548 MPI_CHK( mpi_shift_r( &TB, 1 ) );
1549 }
1550 }
1551
1552 MPI_CHK( mpi_shift_l( &TB, lz ) );
1553 MPI_CHK( mpi_copy( G, &TB ) );
1554
1555 cleanup:
1556
1557 mpi_free( &TB, &TA, &TG, NULL );
1558
1559 return( ret );
1560 }
1561
1562 #if defined(POLARSSL_GENPRIME)
1563
1564 /*
1565 * Modular inverse: X = A^-1 mod N (HAC 14.61 / 14.64)
1566 */
1567 int mpi_inv_mod( mpi *X, const mpi *A, const mpi *N )
1568 {
1569 int ret;
1570 mpi G, TA, TU, U1, U2, TB, TV, V1, V2;
1571
1572 if( mpi_cmp_int( N, 0 ) <= 0 )
1573 return( POLARSSL_ERR_MPI_BAD_INPUT_DATA );
1574
1575 mpi_init( &TA, &TU, &U1, &U2, &G,
1576 &TB, &TV, &V1, &V2, NULL );
1577
1578 MPI_CHK( mpi_gcd( &G, A, N ) );
1579
1580 if( mpi_cmp_int( &G, 1 ) != 0 )
1581 {
1582 ret = POLARSSL_ERR_MPI_NOT_ACCEPTABLE;
1583 goto cleanup;
1584 }
1585
1586 MPI_CHK( mpi_mod_mpi( &TA, A, N ) );
1587 MPI_CHK( mpi_copy( &TU, &TA ) );
1588 MPI_CHK( mpi_copy( &TB, N ) );
1589 MPI_CHK( mpi_copy( &TV, N ) );
1590
1591 MPI_CHK( mpi_lset( &U1, 1 ) );
1592 MPI_CHK( mpi_lset( &U2, 0 ) );
1593 MPI_CHK( mpi_lset( &V1, 0 ) );
1594 MPI_CHK( mpi_lset( &V2, 1 ) );
1595
1596 do
1597 {
1598 while( ( TU.p[0] & 1 ) == 0 )
1599 {
1600 MPI_CHK( mpi_shift_r( &TU, 1 ) );
1601
1602 if( ( U1.p[0] & 1 ) != 0 || ( U2.p[0] & 1 ) != 0 )
1603 {
1604 MPI_CHK( mpi_add_mpi( &U1, &U1, &TB ) );
1605 MPI_CHK( mpi_sub_mpi( &U2, &U2, &TA ) );
1606 }
1607
1608 MPI_CHK( mpi_shift_r( &U1, 1 ) );
1609 MPI_CHK( mpi_shift_r( &U2, 1 ) );
1610 }
1611
1612 while( ( TV.p[0] & 1 ) == 0 )
1613 {
1614 MPI_CHK( mpi_shift_r( &TV, 1 ) );
1615
1616 if( ( V1.p[0] & 1 ) != 0 || ( V2.p[0] & 1 ) != 0 )
1617 {
1618 MPI_CHK( mpi_add_mpi( &V1, &V1, &TB ) );
1619 MPI_CHK( mpi_sub_mpi( &V2, &V2, &TA ) );
1620 }
1621
1622 MPI_CHK( mpi_shift_r( &V1, 1 ) );
1623 MPI_CHK( mpi_shift_r( &V2, 1 ) );
1624 }
1625
1626 if( mpi_cmp_mpi( &TU, &TV ) >= 0 )
1627 {
1628 MPI_CHK( mpi_sub_mpi( &TU, &TU, &TV ) );
1629 MPI_CHK( mpi_sub_mpi( &U1, &U1, &V1 ) );
1630 MPI_CHK( mpi_sub_mpi( &U2, &U2, &V2 ) );
1631 }
1632 else
1633 {
1634 MPI_CHK( mpi_sub_mpi( &TV, &TV, &TU ) );
1635 MPI_CHK( mpi_sub_mpi( &V1, &V1, &U1 ) );
1636 MPI_CHK( mpi_sub_mpi( &V2, &V2, &U2 ) );
1637 }
1638 }
1639 while( mpi_cmp_int( &TU, 0 ) != 0 );
1640
1641 while( mpi_cmp_int( &V1, 0 ) < 0 )
1642 MPI_CHK( mpi_add_mpi( &V1, &V1, N ) );
1643
1644 while( mpi_cmp_mpi( &V1, N ) >= 0 )
1645 MPI_CHK( mpi_sub_mpi( &V1, &V1, N ) );
1646
1647 MPI_CHK( mpi_copy( X, &V1 ) );
1648
1649 cleanup:
1650
1651 mpi_free( &V2, &V1, &TV, &TB, &G,
1652 &U2, &U1, &TU, &TA, NULL );
1653
1654 return( ret );
1655 }
1656
1657 static const int small_prime[] =
1658 {
1659 3, 5, 7, 11, 13, 17, 19, 23,
1660 29, 31, 37, 41, 43, 47, 53, 59,
1661 61, 67, 71, 73, 79, 83, 89, 97,
1662 101, 103, 107, 109, 113, 127, 131, 137,
1663 139, 149, 151, 157, 163, 167, 173, 179,
1664 181, 191, 193, 197, 199, 211, 223, 227,
1665 229, 233, 239, 241, 251, 257, 263, 269,
1666 271, 277, 281, 283, 293, 307, 311, 313,
1667 317, 331, 337, 347, 349, 353, 359, 367,
1668 373, 379, 383, 389, 397, 401, 409, 419,
1669 421, 431, 433, 439, 443, 449, 457, 461,
1670 463, 467, 479, 487, 491, 499, 503, 509,
1671 521, 523, 541, 547, 557, 563, 569, 571,
1672 577, 587, 593, 599, 601, 607, 613, 617,
1673 619, 631, 641, 643, 647, 653, 659, 661,
1674 673, 677, 683, 691, 701, 709, 719, 727,
1675 733, 739, 743, 751, 757, 761, 769, 773,
1676 787, 797, 809, 811, 821, 823, 827, 829,
1677 839, 853, 857, 859, 863, 877, 881, 883,
1678 887, 907, 911, 919, 929, 937, 941, 947,
1679 953, 967, 971, 977, 983, 991, 997, -103
1680 };
1681
1682 /*
1683 * Miller-Rabin primality test (HAC 4.24)
1684 */
1685 int mpi_is_prime( mpi *X, int (*f_rng)(void *), void *p_rng )
1686 {
1687 int ret, i, j, n, s, xs;
1688 mpi W, R, T, A, RR;
1689 unsigned char *p;
1690
1691 if( mpi_cmp_int( X, 0 ) == 0 ||
1692 mpi_cmp_int( X, 1 ) == 0 )
1693 return( POLARSSL_ERR_MPI_NOT_ACCEPTABLE );
1694
1695 if( mpi_cmp_int( X, 2 ) == 0 )
1696 return( 0 );
1697
1698 mpi_init( &W, &R, &T, &A, &RR, NULL );
1699
1700 xs = X->s; X->s = 1;
1701
1702 /*
1703 * test trivial factors first
1704 */
1705 if( ( X->p[0] & 1 ) == 0 )
1706 return( POLARSSL_ERR_MPI_NOT_ACCEPTABLE );
1707
1708 for( i = 0; small_prime[i] > 0; i++ )
1709 {
1710 t_int r;
1711
1712 if( mpi_cmp_int( X, small_prime[i] ) <= 0 )
1713 return( 0 );
1714
1715 MPI_CHK( mpi_mod_int( &r, X, small_prime[i] ) );
1716
1717 if( r == 0 )
1718 return( POLARSSL_ERR_MPI_NOT_ACCEPTABLE );
1719 }
1720
1721 /*
1722 * W = |X| - 1
1723 * R = W >> lsb( W )
1724 */
1725 MPI_CHK( mpi_sub_int( &W, X, 1 ) );
1726 s = mpi_lsb( &W );
1727 MPI_CHK( mpi_copy( &R, &W ) );
1728 MPI_CHK( mpi_shift_r( &R, s ) );
1729
1730 i = mpi_msb( X );
1731 /*
1732 * HAC, table 4.4
1733 */
1734 n = ( ( i >= 1300 ) ? 2 : ( i >= 850 ) ? 3 :
1735 ( i >= 650 ) ? 4 : ( i >= 350 ) ? 8 :
1736 ( i >= 250 ) ? 12 : ( i >= 150 ) ? 18 : 27 );
1737
1738 for( i = 0; i < n; i++ )
1739 {
1740 /*
1741 * pick a random A, 1 < A < |X| - 1
1742 */
1743 MPI_CHK( mpi_grow( &A, X->n ) );
1744
1745 p = (unsigned char *) A.p;
1746 for( j = 0; j < A.n * ciL; j++ )
1747 *p++ = (unsigned char) f_rng( p_rng );
1748
1749 j = mpi_msb( &A ) - mpi_msb( &W );
1750 MPI_CHK( mpi_shift_r( &A, j + 1 ) );
1751 A.p[0] |= 3;
1752
1753 /*
1754 * A = A^R mod |X|
1755 */
1756 MPI_CHK( mpi_exp_mod( &A, &A, &R, X, &RR ) );
1757
1758 if( mpi_cmp_mpi( &A, &W ) == 0 ||
1759 mpi_cmp_int( &A, 1 ) == 0 )
1760 continue;
1761
1762 j = 1;
1763 while( j < s && mpi_cmp_mpi( &A, &W ) != 0 )
1764 {
1765 /*
1766 * A = A * A mod |X|
1767 */
1768 MPI_CHK( mpi_mul_mpi( &T, &A, &A ) );
1769 MPI_CHK( mpi_mod_mpi( &A, &T, X ) );
1770
1771 if( mpi_cmp_int( &A, 1 ) == 0 )
1772 break;
1773
1774 j++;
1775 }
1776
1777 /*
1778 * not prime if A != |X| - 1 or A == 1
1779 */
1780 if( mpi_cmp_mpi( &A, &W ) != 0 ||
1781 mpi_cmp_int( &A, 1 ) == 0 )
1782 {
1783 ret = POLARSSL_ERR_MPI_NOT_ACCEPTABLE;
1784 break;
1785 }
1786 }
1787
1788 cleanup:
1789
1790 X->s = xs;
1791
1792 mpi_free( &RR, &A, &T, &R, &W, NULL );
1793
1794 return( ret );
1795 }
1796
1797 /*
1798 * Prime number generation
1799 */
1800 int mpi_gen_prime( mpi *X, int nbits, int dh_flag,
1801 int (*f_rng)(void *), void *p_rng )
1802 {
1803 int ret, k, n;
1804 unsigned char *p;
1805 mpi Y;
1806
1807 if( nbits < 3 )
1808 return( POLARSSL_ERR_MPI_BAD_INPUT_DATA );
1809
1810 mpi_init( &Y, NULL );
1811
1812 n = BITS_TO_LIMBS( nbits );
1813
1814 MPI_CHK( mpi_grow( X, n ) );
1815 MPI_CHK( mpi_lset( X, 0 ) );
1816
1817 p = (unsigned char *) X->p;
1818 for( k = 0; k < X->n * ciL; k++ )
1819 *p++ = (unsigned char) f_rng( p_rng );
1820
1821 k = mpi_msb( X );
1822 if( k < nbits ) MPI_CHK( mpi_shift_l( X, nbits - k ) );
1823 if( k > nbits ) MPI_CHK( mpi_shift_r( X, k - nbits ) );
1824
1825 X->p[0] |= 3;
1826
1827 if( dh_flag == 0 )
1828 {
1829 while( ( ret = mpi_is_prime( X, f_rng, p_rng ) ) != 0 )
1830 {
1831 if( ret != POLARSSL_ERR_MPI_NOT_ACCEPTABLE )
1832 goto cleanup;
1833
1834 MPI_CHK( mpi_add_int( X, X, 2 ) );
1835 }
1836 }
1837 else
1838 {
1839 MPI_CHK( mpi_sub_int( &Y, X, 1 ) );
1840 MPI_CHK( mpi_shift_r( &Y, 1 ) );
1841
1842 while( 1 )
1843 {
1844 if( ( ret = mpi_is_prime( X, f_rng, p_rng ) ) == 0 )
1845 {
1846 if( ( ret = mpi_is_prime( &Y, f_rng, p_rng ) ) == 0 )
1847 break;
1848
1849 if( ret != POLARSSL_ERR_MPI_NOT_ACCEPTABLE )
1850 goto cleanup;
1851 }
1852
1853 if( ret != POLARSSL_ERR_MPI_NOT_ACCEPTABLE )
1854 goto cleanup;
1855
1856 MPI_CHK( mpi_add_int( &Y, X, 1 ) );
1857 MPI_CHK( mpi_add_int( X, X, 2 ) );
1858 MPI_CHK( mpi_shift_r( &Y, 1 ) );
1859 }
1860 }
1861
1862 cleanup:
1863
1864 mpi_free( &Y, NULL );
1865
1866 return( ret );
1867 }
1868
1869 #endif
1870
1871 #if defined(POLARSSL_SELF_TEST)
1872
1873 #define GCD_PAIR_COUNT 3
1874
1875 static const int gcd_pairs[GCD_PAIR_COUNT][3] =
1876 {
1877 { 693, 609, 21 },
1878 { 1764, 868, 28 },
1879 { 768454923, 542167814, 1 }
1880 };
1881
1882 /*
1883 * Checkup routine
1884 */
1885 int mpi_self_test( int verbose )
1886 {
1887 int ret, i;
1888 mpi A, E, N, X, Y, U, V;
1889
1890 mpi_init( &A, &E, &N, &X, &Y, &U, &V, NULL );
1891
1892 MPI_CHK( mpi_read_string( &A, 16,
1893 "EFE021C2645FD1DC586E69184AF4A31E" \
1894 "D5F53E93B5F123FA41680867BA110131" \
1895 "944FE7952E2517337780CB0DB80E61AA" \
1896 "E7C8DDC6C5C6AADEB34EB38A2F40D5E6" ) );
1897
1898 MPI_CHK( mpi_read_string( &E, 16,
1899 "B2E7EFD37075B9F03FF989C7C5051C20" \
1900 "34D2A323810251127E7BF8625A4F49A5" \
1901 "F3E27F4DA8BD59C47D6DAABA4C8127BD" \
1902 "5B5C25763222FEFCCFC38B832366C29E" ) );
1903
1904 MPI_CHK( mpi_read_string( &N, 16,
1905 "0066A198186C18C10B2F5ED9B522752A" \
1906 "9830B69916E535C8F047518A889A43A5" \
1907 "94B6BED27A168D31D4A52F88925AA8F5" ) );
1908
1909 MPI_CHK( mpi_mul_mpi( &X, &A, &N ) );
1910
1911 MPI_CHK( mpi_read_string( &U, 16,
1912 "602AB7ECA597A3D6B56FF9829A5E8B85" \
1913 "9E857EA95A03512E2BAE7391688D264A" \
1914 "A5663B0341DB9CCFD2C4C5F421FEC814" \
1915 "8001B72E848A38CAE1C65F78E56ABDEF" \
1916 "E12D3C039B8A02D6BE593F0BBBDA56F1" \
1917 "ECF677152EF804370C1A305CAF3B5BF1" \
1918 "30879B56C61DE584A0F53A2447A51E" ) );
1919
1920 if( verbose != 0 )
1921 printf( " MPI test #1 (mul_mpi): " );
1922
1923 if( mpi_cmp_mpi( &X, &U ) != 0 )
1924 {
1925 if( verbose != 0 )
1926 printf( "failed\n" );
1927
1928 return( 1 );
1929 }
1930
1931 if( verbose != 0 )
1932 printf( "passed\n" );
1933
1934 MPI_CHK( mpi_div_mpi( &X, &Y, &A, &N ) );
1935
1936 MPI_CHK( mpi_read_string( &U, 16,
1937 "256567336059E52CAE22925474705F39A94" ) );
1938
1939 MPI_CHK( mpi_read_string( &V, 16,
1940 "6613F26162223DF488E9CD48CC132C7A" \
1941 "0AC93C701B001B092E4E5B9F73BCD27B" \
1942 "9EE50D0657C77F374E903CDFA4C642" ) );
1943
1944 if( verbose != 0 )
1945 printf( " MPI test #2 (div_mpi): " );
1946
1947 if( mpi_cmp_mpi( &X, &U ) != 0 ||
1948 mpi_cmp_mpi( &Y, &V ) != 0 )
1949 {
1950 if( verbose != 0 )
1951 printf( "failed\n" );
1952
1953 return( 1 );
1954 }
1955
1956 if( verbose != 0 )
1957 printf( "passed\n" );
1958
1959 MPI_CHK( mpi_exp_mod( &X, &A, &E, &N, NULL ) );
1960
1961 MPI_CHK( mpi_read_string( &U, 16,
1962 "36E139AEA55215609D2816998ED020BB" \
1963 "BD96C37890F65171D948E9BC7CBAA4D9" \
1964 "325D24D6A3C12710F10A09FA08AB87" ) );
1965
1966 if( verbose != 0 )
1967 printf( " MPI test #3 (exp_mod): " );
1968
1969 if( mpi_cmp_mpi( &X, &U ) != 0 )
1970 {
1971 if( verbose != 0 )
1972 printf( "failed\n" );
1973
1974 return( 1 );
1975 }
1976
1977 if( verbose != 0 )
1978 printf( "passed\n" );
1979
1980 MPI_CHK( mpi_inv_mod( &X, &A, &N ) );
1981
1982 MPI_CHK( mpi_read_string( &U, 16,
1983 "003A0AAEDD7E784FC07D8F9EC6E3BFD5" \
1984 "C3DBA76456363A10869622EAC2DD84EC" \
1985 "C5B8A74DAC4D09E03B5E0BE779F2DF61" ) );
1986
1987 if( verbose != 0 )
1988 printf( " MPI test #4 (inv_mod): " );
1989
1990 if( mpi_cmp_mpi( &X, &U ) != 0 )
1991 {
1992 if( verbose != 0 )
1993 printf( "failed\n" );
1994
1995 return( 1 );
1996 }
1997
1998 if( verbose != 0 )
1999 printf( "passed\n" );
2000
2001 if( verbose != 0 )
2002 printf( " MPI test #5 (simple gcd): " );
2003
2004 for ( i = 0; i < GCD_PAIR_COUNT; i++)
2005 {
2006 MPI_CHK( mpi_lset( &X, gcd_pairs[i][0] ) );
2007 MPI_CHK( mpi_lset( &Y, gcd_pairs[i][1] ) );
2008
2009 MPI_CHK( mpi_gcd( &A, &X, &Y ) );
2010
2011 if( mpi_cmp_int( &A, gcd_pairs[i][2] ) != 0 )
2012 {
2013 if( verbose != 0 )
2014 printf( "failed at %d\n", i );
2015
2016 return( 1 );
2017 }
2018 }
2019
2020 if( verbose != 0 )
2021 printf( "passed\n" );
2022
2023 cleanup:
2024
2025 if( ret != 0 && verbose != 0 )
2026 printf( "Unexpected error, return code = %08X\n", ret );
2027
2028 mpi_free( &V, &U, &Y, &X, &N, &E, &A, NULL );
2029
2030 if( verbose != 0 )
2031 printf( "\n" );
2032
2033 return( ret );
2034 }
2035
2036 #endif
2037
2038 #endif