2 * Multi-precision integer library
4 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
5 * SPDX-License-Identifier: Apache-2.0
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
19 * This file is part of mbed TLS (https://tls.mbed.org)
22 * This MPI implementation is based on:
24 * http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf
25 * http://www.stillhq.com/extracted/gnupg-api/mpi/
26 * http://math.libtomcrypt.com/files/tommath.pdf
29 #if !defined(MBEDTLS_CONFIG_FILE)
30 #include "mbedtls/config.h"
32 #include MBEDTLS_CONFIG_FILE
35 #if defined(MBEDTLS_BIGNUM_C)
37 #include "mbedtls/bignum.h"
38 #include "mbedtls/bn_mul.h"
42 #if defined(MBEDTLS_PLATFORM_C)
43 #include "mbedtls/platform.h"
47 #define mbedtls_printf printf
48 #define mbedtls_calloc calloc
49 #define mbedtls_free free
52 /* Implementation that should never be optimized out by the compiler */
53 static void mbedtls_zeroize( void *v
, size_t n
) {
54 volatile unsigned char *p
= v
; while( n
-- ) *p
++ = 0;
57 #define ciL (sizeof(mbedtls_mpi_uint)) /* chars in limb */
58 #define biL (ciL << 3) /* bits in limb */
59 #define biH (ciL << 2) /* half limb size */
61 #define MPI_SIZE_T_MAX ( (size_t) -1 ) /* SIZE_T_MAX is not standard */
64 * Convert between bits/chars and number of limbs
65 * Divide first in order to avoid potential overflows
67 #define BITS_TO_LIMBS(i) ( (i) / biL + ( (i) % biL != 0 ) )
68 #define CHARS_TO_LIMBS(i) ( (i) / ciL + ( (i) % ciL != 0 ) )
73 void mbedtls_mpi_init( mbedtls_mpi
*X
)
86 void mbedtls_mpi_free( mbedtls_mpi
*X
)
93 mbedtls_zeroize( X
->p
, X
->n
* ciL
);
103 * Enlarge to the specified number of limbs
105 int mbedtls_mpi_grow( mbedtls_mpi
*X
, size_t nblimbs
)
109 if( nblimbs
> MBEDTLS_MPI_MAX_LIMBS
)
110 return( MBEDTLS_ERR_MPI_ALLOC_FAILED
);
114 if( ( p
= mbedtls_calloc( nblimbs
, ciL
) ) == NULL
)
115 return( MBEDTLS_ERR_MPI_ALLOC_FAILED
);
119 memcpy( p
, X
->p
, X
->n
* ciL
);
120 mbedtls_zeroize( X
->p
, X
->n
* ciL
);
121 mbedtls_free( X
->p
);
132 * Resize down as much as possible,
133 * while keeping at least the specified number of limbs
135 int mbedtls_mpi_shrink( mbedtls_mpi
*X
, size_t nblimbs
)
140 /* Actually resize up in this case */
141 if( X
->n
<= nblimbs
)
142 return( mbedtls_mpi_grow( X
, nblimbs
) );
144 for( i
= X
->n
- 1; i
> 0; i
-- )
152 if( ( p
= mbedtls_calloc( i
, ciL
) ) == NULL
)
153 return( MBEDTLS_ERR_MPI_ALLOC_FAILED
);
157 memcpy( p
, X
->p
, i
* ciL
);
158 mbedtls_zeroize( X
->p
, X
->n
* ciL
);
159 mbedtls_free( X
->p
);
169 * Copy the contents of Y into X
171 int mbedtls_mpi_copy( mbedtls_mpi
*X
, const mbedtls_mpi
*Y
)
181 mbedtls_mpi_free( X
);
185 for( i
= Y
->n
- 1; i
> 0; i
-- )
192 MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X
, i
) );
194 memset( X
->p
, 0, X
->n
* ciL
);
195 memcpy( X
->p
, Y
->p
, i
* ciL
);
203 * Swap the contents of X and Y
205 void mbedtls_mpi_swap( mbedtls_mpi
*X
, mbedtls_mpi
*Y
)
209 memcpy( &T
, X
, sizeof( mbedtls_mpi
) );
210 memcpy( X
, Y
, sizeof( mbedtls_mpi
) );
211 memcpy( Y
, &T
, sizeof( mbedtls_mpi
) );
215 * Conditionally assign X = Y, without leaking information
216 * about whether the assignment was made or not.
217 * (Leaking information about the respective sizes of X and Y is ok however.)
219 int mbedtls_mpi_safe_cond_assign( mbedtls_mpi
*X
, const mbedtls_mpi
*Y
, unsigned char assign
)
224 /* make sure assign is 0 or 1 in a time-constant manner */
225 assign
= (assign
| (unsigned char)-assign
) >> 7;
227 MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X
, Y
->n
) );
229 X
->s
= X
->s
* ( 1 - assign
) + Y
->s
* assign
;
231 for( i
= 0; i
< Y
->n
; i
++ )
232 X
->p
[i
] = X
->p
[i
] * ( 1 - assign
) + Y
->p
[i
] * assign
;
234 for( ; i
< X
->n
; i
++ )
235 X
->p
[i
] *= ( 1 - assign
);
242 * Conditionally swap X and Y, without leaking information
243 * about whether the swap was made or not.
244 * Here it is not ok to simply swap the pointers, which whould lead to
245 * different memory access patterns when X and Y are used afterwards.
247 int mbedtls_mpi_safe_cond_swap( mbedtls_mpi
*X
, mbedtls_mpi
*Y
, unsigned char swap
)
251 mbedtls_mpi_uint tmp
;
256 /* make sure swap is 0 or 1 in a time-constant manner */
257 swap
= (swap
| (unsigned char)-swap
) >> 7;
259 MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X
, Y
->n
) );
260 MBEDTLS_MPI_CHK( mbedtls_mpi_grow( Y
, X
->n
) );
263 X
->s
= X
->s
* ( 1 - swap
) + Y
->s
* swap
;
264 Y
->s
= Y
->s
* ( 1 - swap
) + s
* swap
;
267 for( i
= 0; i
< X
->n
; i
++ )
270 X
->p
[i
] = X
->p
[i
] * ( 1 - swap
) + Y
->p
[i
] * swap
;
271 Y
->p
[i
] = Y
->p
[i
] * ( 1 - swap
) + tmp
* swap
;
279 * Set value from integer
281 int mbedtls_mpi_lset( mbedtls_mpi
*X
, mbedtls_mpi_sint z
)
285 MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X
, 1 ) );
286 memset( X
->p
, 0, X
->n
* ciL
);
288 X
->p
[0] = ( z
< 0 ) ? -z
: z
;
289 X
->s
= ( z
< 0 ) ? -1 : 1;
299 int mbedtls_mpi_get_bit( const mbedtls_mpi
*X
, size_t pos
)
301 if( X
->n
* biL
<= pos
)
304 return( ( X
->p
[pos
/ biL
] >> ( pos
% biL
) ) & 0x01 );
308 * Set a bit to a specific value of 0 or 1
310 int mbedtls_mpi_set_bit( mbedtls_mpi
*X
, size_t pos
, unsigned char val
)
313 size_t off
= pos
/ biL
;
314 size_t idx
= pos
% biL
;
316 if( val
!= 0 && val
!= 1 )
317 return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA
);
319 if( X
->n
* biL
<= pos
)
324 MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X
, off
+ 1 ) );
327 X
->p
[off
] &= ~( (mbedtls_mpi_uint
) 0x01 << idx
);
328 X
->p
[off
] |= (mbedtls_mpi_uint
) val
<< idx
;
336 * Return the number of less significant zero-bits
338 size_t mbedtls_mpi_lsb( const mbedtls_mpi
*X
)
340 size_t i
, j
, count
= 0;
342 for( i
= 0; i
< X
->n
; i
++ )
343 for( j
= 0; j
< biL
; j
++, count
++ )
344 if( ( ( X
->p
[i
] >> j
) & 1 ) != 0 )
351 * Return the number of bits
353 size_t mbedtls_mpi_bitlen( const mbedtls_mpi
*X
)
360 for( i
= X
->n
- 1; i
> 0; i
-- )
364 for( j
= biL
; j
> 0; j
-- )
365 if( ( ( X
->p
[i
] >> ( j
- 1 ) ) & 1 ) != 0 )
368 return( ( i
* biL
) + j
);
372 * Return the total size in bytes
374 size_t mbedtls_mpi_size( const mbedtls_mpi
*X
)
376 return( ( mbedtls_mpi_bitlen( X
) + 7 ) >> 3 );
380 * Convert an ASCII character to digit value
382 static int mpi_get_digit( mbedtls_mpi_uint
*d
, int radix
, char c
)
386 if( c
>= 0x30 && c
<= 0x39 ) *d
= c
- 0x30;
387 if( c
>= 0x41 && c
<= 0x46 ) *d
= c
- 0x37;
388 if( c
>= 0x61 && c
<= 0x66 ) *d
= c
- 0x57;
390 if( *d
>= (mbedtls_mpi_uint
) radix
)
391 return( MBEDTLS_ERR_MPI_INVALID_CHARACTER
);
397 * Import from an ASCII string
399 int mbedtls_mpi_read_string( mbedtls_mpi
*X
, int radix
, const char *s
)
402 size_t i
, j
, slen
, n
;
406 if( radix
< 2 || radix
> 16 )
407 return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA
);
409 mbedtls_mpi_init( &T
);
415 if( slen
> MPI_SIZE_T_MAX
>> 2 )
416 return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA
);
418 n
= BITS_TO_LIMBS( slen
<< 2 );
420 MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X
, n
) );
421 MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X
, 0 ) );
423 for( i
= slen
, j
= 0; i
> 0; i
--, j
++ )
425 if( i
== 1 && s
[i
- 1] == '-' )
431 MBEDTLS_MPI_CHK( mpi_get_digit( &d
, radix
, s
[i
- 1] ) );
432 X
->p
[j
/ ( 2 * ciL
)] |= d
<< ( ( j
% ( 2 * ciL
) ) << 2 );
437 MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X
, 0 ) );
439 for( i
= 0; i
< slen
; i
++ )
441 if( i
== 0 && s
[i
] == '-' )
447 MBEDTLS_MPI_CHK( mpi_get_digit( &d
, radix
, s
[i
] ) );
448 MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &T
, X
, radix
) );
452 MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( X
, &T
, d
) );
456 MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( X
, &T
, d
) );
463 mbedtls_mpi_free( &T
);
469 * Helper to write the digits high-order first
471 static int mpi_write_hlp( mbedtls_mpi
*X
, int radix
, char **p
)
476 if( radix
< 2 || radix
> 16 )
477 return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA
);
479 MBEDTLS_MPI_CHK( mbedtls_mpi_mod_int( &r
, X
, radix
) );
480 MBEDTLS_MPI_CHK( mbedtls_mpi_div_int( X
, NULL
, X
, radix
) );
482 if( mbedtls_mpi_cmp_int( X
, 0 ) != 0 )
483 MBEDTLS_MPI_CHK( mpi_write_hlp( X
, radix
, p
) );
486 *(*p
)++ = (char)( r
+ 0x30 );
488 *(*p
)++ = (char)( r
+ 0x37 );
496 * Export into an ASCII string
498 int mbedtls_mpi_write_string( const mbedtls_mpi
*X
, int radix
,
499 char *buf
, size_t buflen
, size_t *olen
)
506 if( radix
< 2 || radix
> 16 )
507 return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA
);
509 n
= mbedtls_mpi_bitlen( X
);
510 if( radix
>= 4 ) n
>>= 1;
511 if( radix
>= 16 ) n
>>= 1;
517 return( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL
);
521 mbedtls_mpi_init( &T
);
531 for( i
= X
->n
, k
= 0; i
> 0; i
-- )
533 for( j
= ciL
; j
> 0; j
-- )
535 c
= ( X
->p
[i
- 1] >> ( ( j
- 1 ) << 3) ) & 0xFF;
537 if( c
== 0 && k
== 0 && ( i
+ j
) != 2 )
540 *(p
++) = "0123456789ABCDEF" [c
/ 16];
541 *(p
++) = "0123456789ABCDEF" [c
% 16];
548 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &T
, X
) );
553 MBEDTLS_MPI_CHK( mpi_write_hlp( &T
, radix
, &p
) );
561 mbedtls_mpi_free( &T
);
566 #if defined(MBEDTLS_FS_IO)
568 * Read X from an opened file
570 int mbedtls_mpi_read_file( mbedtls_mpi
*X
, int radix
, FILE *fin
)
576 * Buffer should have space for (short) label and decimal formatted MPI,
577 * newline characters and '\0'
579 char s
[ MBEDTLS_MPI_RW_BUFFER_SIZE
];
581 memset( s
, 0, sizeof( s
) );
582 if( fgets( s
, sizeof( s
) - 1, fin
) == NULL
)
583 return( MBEDTLS_ERR_MPI_FILE_IO_ERROR
);
586 if( slen
== sizeof( s
) - 2 )
587 return( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL
);
589 if( s
[slen
- 1] == '\n' ) { slen
--; s
[slen
] = '\0'; }
590 if( s
[slen
- 1] == '\r' ) { slen
--; s
[slen
] = '\0'; }
594 if( mpi_get_digit( &d
, radix
, *p
) != 0 )
597 return( mbedtls_mpi_read_string( X
, radix
, p
+ 1 ) );
601 * Write X into an opened file (or stdout if fout == NULL)
603 int mbedtls_mpi_write_file( const char *p
, const mbedtls_mpi
*X
, int radix
, FILE *fout
)
606 size_t n
, slen
, plen
;
608 * Buffer should have space for (short) label and decimal formatted MPI,
609 * newline characters and '\0'
611 char s
[ MBEDTLS_MPI_RW_BUFFER_SIZE
];
613 memset( s
, 0, sizeof( s
) );
615 MBEDTLS_MPI_CHK( mbedtls_mpi_write_string( X
, radix
, s
, sizeof( s
) - 2, &n
) );
617 if( p
== NULL
) p
= "";
626 if( fwrite( p
, 1, plen
, fout
) != plen
||
627 fwrite( s
, 1, slen
, fout
) != slen
)
628 return( MBEDTLS_ERR_MPI_FILE_IO_ERROR
);
631 mbedtls_printf( "%s%s", p
, s
);
637 #endif /* MBEDTLS_FS_IO */
640 * Import X from unsigned binary data, big endian
642 int mbedtls_mpi_read_binary( mbedtls_mpi
*X
, const unsigned char *buf
, size_t buflen
)
647 for( n
= 0; n
< buflen
; n
++ )
651 MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X
, CHARS_TO_LIMBS( buflen
- n
) ) );
652 MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X
, 0 ) );
654 for( i
= buflen
, j
= 0; i
> n
; i
--, j
++ )
655 X
->p
[j
/ ciL
] |= ((mbedtls_mpi_uint
) buf
[i
- 1]) << ((j
% ciL
) << 3);
663 * Export X into unsigned binary data, big endian
665 int mbedtls_mpi_write_binary( const mbedtls_mpi
*X
, unsigned char *buf
, size_t buflen
)
669 n
= mbedtls_mpi_size( X
);
672 return( MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL
);
674 memset( buf
, 0, buflen
);
676 for( i
= buflen
- 1, j
= 0; n
> 0; i
--, j
++, n
-- )
677 buf
[i
] = (unsigned char)( X
->p
[j
/ ciL
] >> ((j
% ciL
) << 3) );
683 * Left-shift: X <<= count
685 int mbedtls_mpi_shift_l( mbedtls_mpi
*X
, size_t count
)
689 mbedtls_mpi_uint r0
= 0, r1
;
692 t1
= count
& (biL
- 1);
694 i
= mbedtls_mpi_bitlen( X
) + count
;
697 MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X
, BITS_TO_LIMBS( i
) ) );
702 * shift by count / limb_size
706 for( i
= X
->n
; i
> v0
; i
-- )
707 X
->p
[i
- 1] = X
->p
[i
- v0
- 1];
714 * shift by count % limb_size
718 for( i
= v0
; i
< X
->n
; i
++ )
720 r1
= X
->p
[i
] >> (biL
- t1
);
733 * Right-shift: X >>= count
735 int mbedtls_mpi_shift_r( mbedtls_mpi
*X
, size_t count
)
738 mbedtls_mpi_uint r0
= 0, r1
;
741 v1
= count
& (biL
- 1);
743 if( v0
> X
->n
|| ( v0
== X
->n
&& v1
> 0 ) )
744 return mbedtls_mpi_lset( X
, 0 );
747 * shift by count / limb_size
751 for( i
= 0; i
< X
->n
- v0
; i
++ )
752 X
->p
[i
] = X
->p
[i
+ v0
];
754 for( ; i
< X
->n
; i
++ )
759 * shift by count % limb_size
763 for( i
= X
->n
; i
> 0; i
-- )
765 r1
= X
->p
[i
- 1] << (biL
- v1
);
776 * Compare unsigned values
778 int mbedtls_mpi_cmp_abs( const mbedtls_mpi
*X
, const mbedtls_mpi
*Y
)
782 for( i
= X
->n
; i
> 0; i
-- )
783 if( X
->p
[i
- 1] != 0 )
786 for( j
= Y
->n
; j
> 0; j
-- )
787 if( Y
->p
[j
- 1] != 0 )
790 if( i
== 0 && j
== 0 )
793 if( i
> j
) return( 1 );
794 if( j
> i
) return( -1 );
798 if( X
->p
[i
- 1] > Y
->p
[i
- 1] ) return( 1 );
799 if( X
->p
[i
- 1] < Y
->p
[i
- 1] ) return( -1 );
806 * Compare signed values
808 int mbedtls_mpi_cmp_mpi( const mbedtls_mpi
*X
, const mbedtls_mpi
*Y
)
812 for( i
= X
->n
; i
> 0; i
-- )
813 if( X
->p
[i
- 1] != 0 )
816 for( j
= Y
->n
; j
> 0; j
-- )
817 if( Y
->p
[j
- 1] != 0 )
820 if( i
== 0 && j
== 0 )
823 if( i
> j
) return( X
->s
);
824 if( j
> i
) return( -Y
->s
);
826 if( X
->s
> 0 && Y
->s
< 0 ) return( 1 );
827 if( Y
->s
> 0 && X
->s
< 0 ) return( -1 );
831 if( X
->p
[i
- 1] > Y
->p
[i
- 1] ) return( X
->s
);
832 if( X
->p
[i
- 1] < Y
->p
[i
- 1] ) return( -X
->s
);
839 * Compare signed values
841 int mbedtls_mpi_cmp_int( const mbedtls_mpi
*X
, mbedtls_mpi_sint z
)
844 mbedtls_mpi_uint p
[1];
846 *p
= ( z
< 0 ) ? -z
: z
;
847 Y
.s
= ( z
< 0 ) ? -1 : 1;
851 return( mbedtls_mpi_cmp_mpi( X
, &Y
) );
855 * Unsigned addition: X = |A| + |B| (HAC 14.7)
857 int mbedtls_mpi_add_abs( mbedtls_mpi
*X
, const mbedtls_mpi
*A
, const mbedtls_mpi
*B
)
861 mbedtls_mpi_uint
*o
, *p
, c
;
865 const mbedtls_mpi
*T
= A
; A
= X
; B
= T
;
869 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X
, A
) );
872 * X should always be positive as a result of unsigned additions.
876 for( j
= B
->n
; j
> 0; j
-- )
877 if( B
->p
[j
- 1] != 0 )
880 MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X
, j
) );
882 o
= B
->p
; p
= X
->p
; c
= 0;
884 for( i
= 0; i
< j
; i
++, o
++, p
++ )
886 *p
+= c
; c
= ( *p
< c
);
887 *p
+= *o
; c
+= ( *p
< *o
);
894 MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X
, i
+ 1 ) );
898 *p
+= c
; c
= ( *p
< c
); i
++; p
++;
907 * Helper for mbedtls_mpi subtraction
909 static void mpi_sub_hlp( size_t n
, mbedtls_mpi_uint
*s
, mbedtls_mpi_uint
*d
)
912 mbedtls_mpi_uint c
, z
;
914 for( i
= c
= 0; i
< n
; i
++, s
++, d
++ )
916 z
= ( *d
< c
); *d
-= c
;
917 c
= ( *d
< *s
) + z
; *d
-= *s
;
922 z
= ( *d
< c
); *d
-= c
;
928 * Unsigned subtraction: X = |A| - |B| (HAC 14.9)
930 int mbedtls_mpi_sub_abs( mbedtls_mpi
*X
, const mbedtls_mpi
*A
, const mbedtls_mpi
*B
)
936 if( mbedtls_mpi_cmp_abs( A
, B
) < 0 )
937 return( MBEDTLS_ERR_MPI_NEGATIVE_VALUE
);
939 mbedtls_mpi_init( &TB
);
943 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TB
, B
) );
948 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X
, A
) );
951 * X should always be positive as a result of unsigned subtractions.
957 for( n
= B
->n
; n
> 0; n
-- )
958 if( B
->p
[n
- 1] != 0 )
961 mpi_sub_hlp( n
, B
->p
, X
->p
);
965 mbedtls_mpi_free( &TB
);
971 * Signed addition: X = A + B
973 int mbedtls_mpi_add_mpi( mbedtls_mpi
*X
, const mbedtls_mpi
*A
, const mbedtls_mpi
*B
)
977 if( A
->s
* B
->s
< 0 )
979 if( mbedtls_mpi_cmp_abs( A
, B
) >= 0 )
981 MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X
, A
, B
) );
986 MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X
, B
, A
) );
992 MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( X
, A
, B
) );
1002 * Signed subtraction: X = A - B
1004 int mbedtls_mpi_sub_mpi( mbedtls_mpi
*X
, const mbedtls_mpi
*A
, const mbedtls_mpi
*B
)
1008 if( A
->s
* B
->s
> 0 )
1010 if( mbedtls_mpi_cmp_abs( A
, B
) >= 0 )
1012 MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X
, A
, B
) );
1017 MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X
, B
, A
) );
1023 MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( X
, A
, B
) );
1033 * Signed addition: X = A + b
1035 int mbedtls_mpi_add_int( mbedtls_mpi
*X
, const mbedtls_mpi
*A
, mbedtls_mpi_sint b
)
1038 mbedtls_mpi_uint p
[1];
1040 p
[0] = ( b
< 0 ) ? -b
: b
;
1041 _B
.s
= ( b
< 0 ) ? -1 : 1;
1045 return( mbedtls_mpi_add_mpi( X
, A
, &_B
) );
1049 * Signed subtraction: X = A - b
1051 int mbedtls_mpi_sub_int( mbedtls_mpi
*X
, const mbedtls_mpi
*A
, mbedtls_mpi_sint b
)
1054 mbedtls_mpi_uint p
[1];
1056 p
[0] = ( b
< 0 ) ? -b
: b
;
1057 _B
.s
= ( b
< 0 ) ? -1 : 1;
1061 return( mbedtls_mpi_sub_mpi( X
, A
, &_B
) );
1065 * Helper for mbedtls_mpi multiplication
1068 #if defined(__APPLE__) && defined(__arm__)
1070 * Apple LLVM version 4.2 (clang-425.0.24) (based on LLVM 3.2svn)
1071 * appears to need this to prevent bad ARM code generation at -O3.
1073 __attribute__ ((noinline
))
1075 void mpi_mul_hlp( size_t i
, mbedtls_mpi_uint
*s
, mbedtls_mpi_uint
*d
, mbedtls_mpi_uint b
)
1077 mbedtls_mpi_uint c
= 0, t
= 0;
1079 #if defined(MULADDC_HUIT)
1080 for( ; i
>= 8; i
-= 8 )
1093 #else /* MULADDC_HUIT */
1094 for( ; i
>= 16; i
-= 16 )
1097 MULADDC_CORE MULADDC_CORE
1098 MULADDC_CORE MULADDC_CORE
1099 MULADDC_CORE MULADDC_CORE
1100 MULADDC_CORE MULADDC_CORE
1102 MULADDC_CORE MULADDC_CORE
1103 MULADDC_CORE MULADDC_CORE
1104 MULADDC_CORE MULADDC_CORE
1105 MULADDC_CORE MULADDC_CORE
1109 for( ; i
>= 8; i
-= 8 )
1112 MULADDC_CORE MULADDC_CORE
1113 MULADDC_CORE MULADDC_CORE
1115 MULADDC_CORE MULADDC_CORE
1116 MULADDC_CORE MULADDC_CORE
1126 #endif /* MULADDC_HUIT */
1131 *d
+= c
; c
= ( *d
< c
); d
++;
1137 * Baseline multiplication: X = A * B (HAC 14.12)
1139 int mbedtls_mpi_mul_mpi( mbedtls_mpi
*X
, const mbedtls_mpi
*A
, const mbedtls_mpi
*B
)
1145 mbedtls_mpi_init( &TA
); mbedtls_mpi_init( &TB
);
1147 if( X
== A
) { MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TA
, A
) ); A
= &TA
; }
1148 if( X
== B
) { MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TB
, B
) ); B
= &TB
; }
1150 for( i
= A
->n
; i
> 0; i
-- )
1151 if( A
->p
[i
- 1] != 0 )
1154 for( j
= B
->n
; j
> 0; j
-- )
1155 if( B
->p
[j
- 1] != 0 )
1158 MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X
, i
+ j
) );
1159 MBEDTLS_MPI_CHK( mbedtls_mpi_lset( X
, 0 ) );
1161 for( i
++; j
> 0; j
-- )
1162 mpi_mul_hlp( i
- 1, A
->p
, X
->p
+ j
- 1, B
->p
[j
- 1] );
1168 mbedtls_mpi_free( &TB
); mbedtls_mpi_free( &TA
);
1174 * Baseline multiplication: X = A * b
1176 int mbedtls_mpi_mul_int( mbedtls_mpi
*X
, const mbedtls_mpi
*A
, mbedtls_mpi_uint b
)
1179 mbedtls_mpi_uint p
[1];
1186 return( mbedtls_mpi_mul_mpi( X
, A
, &_B
) );
1190 * Division by mbedtls_mpi: A = Q * B + R (HAC 14.20)
1192 int mbedtls_mpi_div_mpi( mbedtls_mpi
*Q
, mbedtls_mpi
*R
, const mbedtls_mpi
*A
, const mbedtls_mpi
*B
)
1196 mbedtls_mpi X
, Y
, Z
, T1
, T2
;
1198 if( mbedtls_mpi_cmp_int( B
, 0 ) == 0 )
1199 return( MBEDTLS_ERR_MPI_DIVISION_BY_ZERO
);
1201 mbedtls_mpi_init( &X
); mbedtls_mpi_init( &Y
); mbedtls_mpi_init( &Z
);
1202 mbedtls_mpi_init( &T1
); mbedtls_mpi_init( &T2
);
1204 if( mbedtls_mpi_cmp_abs( A
, B
) < 0 )
1206 if( Q
!= NULL
) MBEDTLS_MPI_CHK( mbedtls_mpi_lset( Q
, 0 ) );
1207 if( R
!= NULL
) MBEDTLS_MPI_CHK( mbedtls_mpi_copy( R
, A
) );
1211 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &X
, A
) );
1212 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &Y
, B
) );
1215 MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &Z
, A
->n
+ 2 ) );
1216 MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &Z
, 0 ) );
1217 MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &T1
, 2 ) );
1218 MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &T2
, 3 ) );
1220 k
= mbedtls_mpi_bitlen( &Y
) % biL
;
1224 MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &X
, k
) );
1225 MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &Y
, k
) );
1231 MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &Y
, biL
* ( n
- t
) ) );
1233 while( mbedtls_mpi_cmp_mpi( &X
, &Y
) >= 0 )
1236 MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &X
, &X
, &Y
) );
1238 MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &Y
, biL
* ( n
- t
) ) );
1240 for( i
= n
; i
> t
; i
-- )
1242 if( X
.p
[i
] >= Y
.p
[t
] )
1243 Z
.p
[i
- t
- 1] = ~0;
1246 #if defined(MBEDTLS_HAVE_UDBL)
1249 r
= (mbedtls_t_udbl
) X
.p
[i
] << biL
;
1250 r
|= (mbedtls_t_udbl
) X
.p
[i
- 1];
1252 if( r
> ( (mbedtls_t_udbl
) 1 << biL
) - 1 )
1253 r
= ( (mbedtls_t_udbl
) 1 << biL
) - 1;
1255 Z
.p
[i
- t
- 1] = (mbedtls_mpi_uint
) r
;
1258 * __udiv_qrnnd_c, from gmp/longlong.h
1260 mbedtls_mpi_uint q0
, q1
, r0
, r1
;
1261 mbedtls_mpi_uint d0
, d1
, d
, m
;
1264 d0
= ( d
<< biH
) >> biH
;
1268 r1
= X
.p
[i
] - d1
* q1
;
1270 r1
|= ( X
.p
[i
- 1] >> biH
);
1276 while( r1
>= d
&& r1
< m
)
1284 r0
|= ( X
.p
[i
- 1] << biH
) >> biH
;
1290 while( r0
>= d
&& r0
< m
)
1295 Z
.p
[i
- t
- 1] = ( q1
<< biH
) | q0
;
1296 #endif /* MBEDTLS_HAVE_UDBL && !64-bit Apple with Clang 5.0 */
1304 MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &T1
, 0 ) );
1305 T1
.p
[0] = ( t
< 1 ) ? 0 : Y
.p
[t
- 1];
1307 MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &T1
, &T1
, Z
.p
[i
- t
- 1] ) );
1309 MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &T2
, 0 ) );
1310 T2
.p
[0] = ( i
< 2 ) ? 0 : X
.p
[i
- 2];
1311 T2
.p
[1] = ( i
< 1 ) ? 0 : X
.p
[i
- 1];
1314 while( mbedtls_mpi_cmp_mpi( &T1
, &T2
) > 0 );
1316 MBEDTLS_MPI_CHK( mbedtls_mpi_mul_int( &T1
, &Y
, Z
.p
[i
- t
- 1] ) );
1317 MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &T1
, biL
* ( i
- t
- 1 ) ) );
1318 MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &X
, &X
, &T1
) );
1320 if( mbedtls_mpi_cmp_int( &X
, 0 ) < 0 )
1322 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &T1
, &Y
) );
1323 MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &T1
, biL
* ( i
- t
- 1 ) ) );
1324 MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &X
, &X
, &T1
) );
1331 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( Q
, &Z
) );
1337 MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &X
, k
) );
1339 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( R
, &X
) );
1341 if( mbedtls_mpi_cmp_int( R
, 0 ) == 0 )
1347 mbedtls_mpi_free( &X
); mbedtls_mpi_free( &Y
); mbedtls_mpi_free( &Z
);
1348 mbedtls_mpi_free( &T1
); mbedtls_mpi_free( &T2
);
1354 * Division by int: A = Q * b + R
1356 int mbedtls_mpi_div_int( mbedtls_mpi
*Q
, mbedtls_mpi
*R
, const mbedtls_mpi
*A
, mbedtls_mpi_sint b
)
1359 mbedtls_mpi_uint p
[1];
1361 p
[0] = ( b
< 0 ) ? -b
: b
;
1362 _B
.s
= ( b
< 0 ) ? -1 : 1;
1366 return( mbedtls_mpi_div_mpi( Q
, R
, A
, &_B
) );
1370 * Modulo: R = A mod B
1372 int mbedtls_mpi_mod_mpi( mbedtls_mpi
*R
, const mbedtls_mpi
*A
, const mbedtls_mpi
*B
)
1376 if( mbedtls_mpi_cmp_int( B
, 0 ) < 0 )
1377 return( MBEDTLS_ERR_MPI_NEGATIVE_VALUE
);
1379 MBEDTLS_MPI_CHK( mbedtls_mpi_div_mpi( NULL
, R
, A
, B
) );
1381 while( mbedtls_mpi_cmp_int( R
, 0 ) < 0 )
1382 MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( R
, R
, B
) );
1384 while( mbedtls_mpi_cmp_mpi( R
, B
) >= 0 )
1385 MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( R
, R
, B
) );
1393 * Modulo: r = A mod b
1395 int mbedtls_mpi_mod_int( mbedtls_mpi_uint
*r
, const mbedtls_mpi
*A
, mbedtls_mpi_sint b
)
1398 mbedtls_mpi_uint x
, y
, z
;
1401 return( MBEDTLS_ERR_MPI_DIVISION_BY_ZERO
);
1404 return( MBEDTLS_ERR_MPI_NEGATIVE_VALUE
);
1407 * handle trivial cases
1424 for( i
= A
->n
, y
= 0; i
> 0; i
-- )
1427 y
= ( y
<< biH
) | ( x
>> biH
);
1432 y
= ( y
<< biH
) | ( x
>> biH
);
1438 * If A is negative, then the current y represents a negative value.
1439 * Flipping it to the positive side.
1441 if( A
->s
< 0 && y
!= 0 )
1450 * Fast Montgomery initialization (thanks to Tom St Denis)
1452 static void mpi_montg_init( mbedtls_mpi_uint
*mm
, const mbedtls_mpi
*N
)
1454 mbedtls_mpi_uint x
, m0
= N
->p
[0];
1458 x
+= ( ( m0
+ 2 ) & 4 ) << 1;
1460 for( i
= biL
; i
>= 8; i
/= 2 )
1461 x
*= ( 2 - ( m0
* x
) );
1467 * Montgomery multiplication: A = A * B * R^-1 mod N (HAC 14.36)
1469 static void mpi_montmul( mbedtls_mpi
*A
, const mbedtls_mpi
*B
, const mbedtls_mpi
*N
, mbedtls_mpi_uint mm
,
1470 const mbedtls_mpi
*T
)
1473 mbedtls_mpi_uint u0
, u1
, *d
;
1475 memset( T
->p
, 0, T
->n
* ciL
);
1479 m
= ( B
->n
< n
) ? B
->n
: n
;
1481 for( i
= 0; i
< n
; i
++ )
1484 * T = (T + u0*B + u1*N) / 2^biL
1487 u1
= ( d
[0] + u0
* B
->p
[0] ) * mm
;
1489 mpi_mul_hlp( m
, B
->p
, d
, u0
);
1490 mpi_mul_hlp( n
, N
->p
, d
, u1
);
1492 *d
++ = u0
; d
[n
+ 1] = 0;
1495 memcpy( A
->p
, d
, ( n
+ 1 ) * ciL
);
1497 if( mbedtls_mpi_cmp_abs( A
, N
) >= 0 )
1498 mpi_sub_hlp( n
, N
->p
, A
->p
);
1500 /* prevent timing attacks */
1501 mpi_sub_hlp( n
, A
->p
, T
->p
);
1505 * Montgomery reduction: A = A * R^-1 mod N
1507 static void mpi_montred( mbedtls_mpi
*A
, const mbedtls_mpi
*N
, mbedtls_mpi_uint mm
, const mbedtls_mpi
*T
)
1509 mbedtls_mpi_uint z
= 1;
1512 U
.n
= U
.s
= (int) z
;
1515 mpi_montmul( A
, &U
, N
, mm
, T
);
1519 * Sliding-window exponentiation: X = A^E mod N (HAC 14.85)
1521 int mbedtls_mpi_exp_mod( mbedtls_mpi
*X
, const mbedtls_mpi
*A
, const mbedtls_mpi
*E
, const mbedtls_mpi
*N
, mbedtls_mpi
*_RR
)
1524 size_t wbits
, wsize
, one
= 1;
1525 size_t i
, j
, nblimbs
;
1526 size_t bufsize
, nbits
;
1527 mbedtls_mpi_uint ei
, mm
, state
;
1528 mbedtls_mpi RR
, T
, W
[ 2 << MBEDTLS_MPI_WINDOW_SIZE
], Apos
;
1531 if( mbedtls_mpi_cmp_int( N
, 0 ) < 0 || ( N
->p
[0] & 1 ) == 0 )
1532 return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA
);
1534 if( mbedtls_mpi_cmp_int( E
, 0 ) < 0 )
1535 return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA
);
1538 * Init temps and window size
1540 mpi_montg_init( &mm
, N
);
1541 mbedtls_mpi_init( &RR
); mbedtls_mpi_init( &T
);
1542 mbedtls_mpi_init( &Apos
);
1543 memset( W
, 0, sizeof( W
) );
1545 i
= mbedtls_mpi_bitlen( E
);
1547 wsize
= ( i
> 671 ) ? 6 : ( i
> 239 ) ? 5 :
1548 ( i
> 79 ) ? 4 : ( i
> 23 ) ? 3 : 1;
1550 if( wsize
> MBEDTLS_MPI_WINDOW_SIZE
)
1551 wsize
= MBEDTLS_MPI_WINDOW_SIZE
;
1554 MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X
, j
) );
1555 MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &W
[1], j
) );
1556 MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &T
, j
* 2 ) );
1559 * Compensate for negative A (and correct at the end)
1561 neg
= ( A
->s
== -1 );
1564 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &Apos
, A
) );
1570 * If 1st call, pre-compute R^2 mod N
1572 if( _RR
== NULL
|| _RR
->p
== NULL
)
1574 MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &RR
, 1 ) );
1575 MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &RR
, N
->n
* 2 * biL
) );
1576 MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &RR
, &RR
, N
) );
1579 memcpy( _RR
, &RR
, sizeof( mbedtls_mpi
) );
1582 memcpy( &RR
, _RR
, sizeof( mbedtls_mpi
) );
1585 * W[1] = A * R^2 * R^-1 mod N = A * R mod N
1587 if( mbedtls_mpi_cmp_mpi( A
, N
) >= 0 )
1588 MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &W
[1], A
, N
) );
1590 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &W
[1], A
) );
1592 mpi_montmul( &W
[1], &RR
, N
, mm
, &T
);
1595 * X = R^2 * R^-1 mod N = R mod N
1597 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X
, &RR
) );
1598 mpi_montred( X
, N
, mm
, &T
);
1603 * W[1 << (wsize - 1)] = W[1] ^ (wsize - 1)
1605 j
= one
<< ( wsize
- 1 );
1607 MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &W
[j
], N
->n
+ 1 ) );
1608 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &W
[j
], &W
[1] ) );
1610 for( i
= 0; i
< wsize
- 1; i
++ )
1611 mpi_montmul( &W
[j
], &W
[j
], N
, mm
, &T
);
1614 * W[i] = W[i - 1] * W[1]
1616 for( i
= j
+ 1; i
< ( one
<< wsize
); i
++ )
1618 MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &W
[i
], N
->n
+ 1 ) );
1619 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &W
[i
], &W
[i
- 1] ) );
1621 mpi_montmul( &W
[i
], &W
[1], N
, mm
, &T
);
1640 bufsize
= sizeof( mbedtls_mpi_uint
) << 3;
1645 ei
= (E
->p
[nblimbs
] >> bufsize
) & 1;
1650 if( ei
== 0 && state
== 0 )
1653 if( ei
== 0 && state
== 1 )
1656 * out of window, square X
1658 mpi_montmul( X
, X
, N
, mm
, &T
);
1663 * add ei to current window
1668 wbits
|= ( ei
<< ( wsize
- nbits
) );
1670 if( nbits
== wsize
)
1673 * X = X^wsize R^-1 mod N
1675 for( i
= 0; i
< wsize
; i
++ )
1676 mpi_montmul( X
, X
, N
, mm
, &T
);
1679 * X = X * W[wbits] R^-1 mod N
1681 mpi_montmul( X
, &W
[wbits
], N
, mm
, &T
);
1690 * process the remaining bits
1692 for( i
= 0; i
< nbits
; i
++ )
1694 mpi_montmul( X
, X
, N
, mm
, &T
);
1698 if( ( wbits
& ( one
<< wsize
) ) != 0 )
1699 mpi_montmul( X
, &W
[1], N
, mm
, &T
);
1703 * X = A^E * R * R^-1 mod N = A^E mod N
1705 mpi_montred( X
, N
, mm
, &T
);
1710 MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( X
, N
, X
) );
1715 for( i
= ( one
<< ( wsize
- 1 ) ); i
< ( one
<< wsize
); i
++ )
1716 mbedtls_mpi_free( &W
[i
] );
1718 mbedtls_mpi_free( &W
[1] ); mbedtls_mpi_free( &T
); mbedtls_mpi_free( &Apos
);
1720 if( _RR
== NULL
|| _RR
->p
== NULL
)
1721 mbedtls_mpi_free( &RR
);
1727 * Greatest common divisor: G = gcd(A, B) (HAC 14.54)
1729 int mbedtls_mpi_gcd( mbedtls_mpi
*G
, const mbedtls_mpi
*A
, const mbedtls_mpi
*B
)
1733 mbedtls_mpi TG
, TA
, TB
;
1735 mbedtls_mpi_init( &TG
); mbedtls_mpi_init( &TA
); mbedtls_mpi_init( &TB
);
1737 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TA
, A
) );
1738 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TB
, B
) );
1740 lz
= mbedtls_mpi_lsb( &TA
);
1741 lzt
= mbedtls_mpi_lsb( &TB
);
1746 MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TA
, lz
) );
1747 MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TB
, lz
) );
1751 while( mbedtls_mpi_cmp_int( &TA
, 0 ) != 0 )
1753 MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TA
, mbedtls_mpi_lsb( &TA
) ) );
1754 MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TB
, mbedtls_mpi_lsb( &TB
) ) );
1756 if( mbedtls_mpi_cmp_mpi( &TA
, &TB
) >= 0 )
1758 MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( &TA
, &TA
, &TB
) );
1759 MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TA
, 1 ) );
1763 MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( &TB
, &TB
, &TA
) );
1764 MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TB
, 1 ) );
1768 MBEDTLS_MPI_CHK( mbedtls_mpi_shift_l( &TB
, lz
) );
1769 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( G
, &TB
) );
1773 mbedtls_mpi_free( &TG
); mbedtls_mpi_free( &TA
); mbedtls_mpi_free( &TB
);
1779 * Fill X with size bytes of random.
1781 * Use a temporary bytes representation to make sure the result is the same
1782 * regardless of the platform endianness (useful when f_rng is actually
1783 * deterministic, eg for tests).
1785 int mbedtls_mpi_fill_random( mbedtls_mpi
*X
, size_t size
,
1786 int (*f_rng
)(void *, unsigned char *, size_t),
1790 unsigned char buf
[MBEDTLS_MPI_MAX_SIZE
];
1792 if( size
> MBEDTLS_MPI_MAX_SIZE
)
1793 return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA
);
1795 MBEDTLS_MPI_CHK( f_rng( p_rng
, buf
, size
) );
1796 MBEDTLS_MPI_CHK( mbedtls_mpi_read_binary( X
, buf
, size
) );
1803 * Modular inverse: X = A^-1 mod N (HAC 14.61 / 14.64)
1805 int mbedtls_mpi_inv_mod( mbedtls_mpi
*X
, const mbedtls_mpi
*A
, const mbedtls_mpi
*N
)
1808 mbedtls_mpi G
, TA
, TU
, U1
, U2
, TB
, TV
, V1
, V2
;
1810 if( mbedtls_mpi_cmp_int( N
, 0 ) <= 0 )
1811 return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA
);
1813 mbedtls_mpi_init( &TA
); mbedtls_mpi_init( &TU
); mbedtls_mpi_init( &U1
); mbedtls_mpi_init( &U2
);
1814 mbedtls_mpi_init( &G
); mbedtls_mpi_init( &TB
); mbedtls_mpi_init( &TV
);
1815 mbedtls_mpi_init( &V1
); mbedtls_mpi_init( &V2
);
1817 MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( &G
, A
, N
) );
1819 if( mbedtls_mpi_cmp_int( &G
, 1 ) != 0 )
1821 ret
= MBEDTLS_ERR_MPI_NOT_ACCEPTABLE
;
1825 MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &TA
, A
, N
) );
1826 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TU
, &TA
) );
1827 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TB
, N
) );
1828 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &TV
, N
) );
1830 MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &U1
, 1 ) );
1831 MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &U2
, 0 ) );
1832 MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &V1
, 0 ) );
1833 MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &V2
, 1 ) );
1837 while( ( TU
.p
[0] & 1 ) == 0 )
1839 MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TU
, 1 ) );
1841 if( ( U1
.p
[0] & 1 ) != 0 || ( U2
.p
[0] & 1 ) != 0 )
1843 MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &U1
, &U1
, &TB
) );
1844 MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &U2
, &U2
, &TA
) );
1847 MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &U1
, 1 ) );
1848 MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &U2
, 1 ) );
1851 while( ( TV
.p
[0] & 1 ) == 0 )
1853 MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &TV
, 1 ) );
1855 if( ( V1
.p
[0] & 1 ) != 0 || ( V2
.p
[0] & 1 ) != 0 )
1857 MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &V1
, &V1
, &TB
) );
1858 MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &V2
, &V2
, &TA
) );
1861 MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &V1
, 1 ) );
1862 MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &V2
, 1 ) );
1865 if( mbedtls_mpi_cmp_mpi( &TU
, &TV
) >= 0 )
1867 MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &TU
, &TU
, &TV
) );
1868 MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &U1
, &U1
, &V1
) );
1869 MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &U2
, &U2
, &V2
) );
1873 MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &TV
, &TV
, &TU
) );
1874 MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &V1
, &V1
, &U1
) );
1875 MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &V2
, &V2
, &U2
) );
1878 while( mbedtls_mpi_cmp_int( &TU
, 0 ) != 0 );
1880 while( mbedtls_mpi_cmp_int( &V1
, 0 ) < 0 )
1881 MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &V1
, &V1
, N
) );
1883 while( mbedtls_mpi_cmp_mpi( &V1
, N
) >= 0 )
1884 MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &V1
, &V1
, N
) );
1886 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X
, &V1
) );
1890 mbedtls_mpi_free( &TA
); mbedtls_mpi_free( &TU
); mbedtls_mpi_free( &U1
); mbedtls_mpi_free( &U2
);
1891 mbedtls_mpi_free( &G
); mbedtls_mpi_free( &TB
); mbedtls_mpi_free( &TV
);
1892 mbedtls_mpi_free( &V1
); mbedtls_mpi_free( &V2
);
1897 #if defined(MBEDTLS_GENPRIME)
1899 static const int small_prime
[] =
1901 3, 5, 7, 11, 13, 17, 19, 23,
1902 29, 31, 37, 41, 43, 47, 53, 59,
1903 61, 67, 71, 73, 79, 83, 89, 97,
1904 101, 103, 107, 109, 113, 127, 131, 137,
1905 139, 149, 151, 157, 163, 167, 173, 179,
1906 181, 191, 193, 197, 199, 211, 223, 227,
1907 229, 233, 239, 241, 251, 257, 263, 269,
1908 271, 277, 281, 283, 293, 307, 311, 313,
1909 317, 331, 337, 347, 349, 353, 359, 367,
1910 373, 379, 383, 389, 397, 401, 409, 419,
1911 421, 431, 433, 439, 443, 449, 457, 461,
1912 463, 467, 479, 487, 491, 499, 503, 509,
1913 521, 523, 541, 547, 557, 563, 569, 571,
1914 577, 587, 593, 599, 601, 607, 613, 617,
1915 619, 631, 641, 643, 647, 653, 659, 661,
1916 673, 677, 683, 691, 701, 709, 719, 727,
1917 733, 739, 743, 751, 757, 761, 769, 773,
1918 787, 797, 809, 811, 821, 823, 827, 829,
1919 839, 853, 857, 859, 863, 877, 881, 883,
1920 887, 907, 911, 919, 929, 937, 941, 947,
1921 953, 967, 971, 977, 983, 991, 997, -103
1925 * Small divisors test (X must be positive)
1928 * 0: no small factor (possible prime, more tests needed)
1930 * MBEDTLS_ERR_MPI_NOT_ACCEPTABLE: certain non-prime
1931 * other negative: error
1933 static int mpi_check_small_factors( const mbedtls_mpi
*X
)
1939 if( ( X
->p
[0] & 1 ) == 0 )
1940 return( MBEDTLS_ERR_MPI_NOT_ACCEPTABLE
);
1942 for( i
= 0; small_prime
[i
] > 0; i
++ )
1944 if( mbedtls_mpi_cmp_int( X
, small_prime
[i
] ) <= 0 )
1947 MBEDTLS_MPI_CHK( mbedtls_mpi_mod_int( &r
, X
, small_prime
[i
] ) );
1950 return( MBEDTLS_ERR_MPI_NOT_ACCEPTABLE
);
1958 * Miller-Rabin pseudo-primality test (HAC 4.24)
1960 static int mpi_miller_rabin( const mbedtls_mpi
*X
,
1961 int (*f_rng
)(void *, unsigned char *, size_t),
1965 size_t i
, j
, k
, n
, s
;
1966 mbedtls_mpi W
, R
, T
, A
, RR
;
1968 mbedtls_mpi_init( &W
); mbedtls_mpi_init( &R
); mbedtls_mpi_init( &T
); mbedtls_mpi_init( &A
);
1969 mbedtls_mpi_init( &RR
);
1975 MBEDTLS_MPI_CHK( mbedtls_mpi_sub_int( &W
, X
, 1 ) );
1976 s
= mbedtls_mpi_lsb( &W
);
1977 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &R
, &W
) );
1978 MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &R
, s
) );
1980 i
= mbedtls_mpi_bitlen( X
);
1984 n
= ( ( i
>= 1300 ) ? 2 : ( i
>= 850 ) ? 3 :
1985 ( i
>= 650 ) ? 4 : ( i
>= 350 ) ? 8 :
1986 ( i
>= 250 ) ? 12 : ( i
>= 150 ) ? 18 : 27 );
1988 for( i
= 0; i
< n
; i
++ )
1991 * pick a random A, 1 < A < |X| - 1
1993 MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &A
, X
->n
* ciL
, f_rng
, p_rng
) );
1995 if( mbedtls_mpi_cmp_mpi( &A
, &W
) >= 0 )
1997 j
= mbedtls_mpi_bitlen( &A
) - mbedtls_mpi_bitlen( &W
);
1998 MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &A
, j
+ 1 ) );
2004 MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( &A
, X
->n
* ciL
, f_rng
, p_rng
) );
2006 j
= mbedtls_mpi_bitlen( &A
);
2007 k
= mbedtls_mpi_bitlen( &W
);
2009 MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &A
, j
- k
) );
2013 return MBEDTLS_ERR_MPI_NOT_ACCEPTABLE
;
2016 } while ( mbedtls_mpi_cmp_mpi( &A
, &W
) >= 0 ||
2017 mbedtls_mpi_cmp_int( &A
, 1 ) <= 0 );
2022 MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &A
, &A
, &R
, X
, &RR
) );
2024 if( mbedtls_mpi_cmp_mpi( &A
, &W
) == 0 ||
2025 mbedtls_mpi_cmp_int( &A
, 1 ) == 0 )
2029 while( j
< s
&& mbedtls_mpi_cmp_mpi( &A
, &W
) != 0 )
2034 MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &T
, &A
, &A
) );
2035 MBEDTLS_MPI_CHK( mbedtls_mpi_mod_mpi( &A
, &T
, X
) );
2037 if( mbedtls_mpi_cmp_int( &A
, 1 ) == 0 )
2044 * not prime if A != |X| - 1 or A == 1
2046 if( mbedtls_mpi_cmp_mpi( &A
, &W
) != 0 ||
2047 mbedtls_mpi_cmp_int( &A
, 1 ) == 0 )
2049 ret
= MBEDTLS_ERR_MPI_NOT_ACCEPTABLE
;
2055 mbedtls_mpi_free( &W
); mbedtls_mpi_free( &R
); mbedtls_mpi_free( &T
); mbedtls_mpi_free( &A
);
2056 mbedtls_mpi_free( &RR
);
2062 * Pseudo-primality test: small factors, then Miller-Rabin
2064 int mbedtls_mpi_is_prime( const mbedtls_mpi
*X
,
2065 int (*f_rng
)(void *, unsigned char *, size_t),
2075 if( mbedtls_mpi_cmp_int( &XX
, 0 ) == 0 ||
2076 mbedtls_mpi_cmp_int( &XX
, 1 ) == 0 )
2077 return( MBEDTLS_ERR_MPI_NOT_ACCEPTABLE
);
2079 if( mbedtls_mpi_cmp_int( &XX
, 2 ) == 0 )
2082 if( ( ret
= mpi_check_small_factors( &XX
) ) != 0 )
2090 return( mpi_miller_rabin( &XX
, f_rng
, p_rng
) );
2094 * Prime number generation
2096 int mbedtls_mpi_gen_prime( mbedtls_mpi
*X
, size_t nbits
, int dh_flag
,
2097 int (*f_rng
)(void *, unsigned char *, size_t),
2105 if( nbits
< 3 || nbits
> MBEDTLS_MPI_MAX_BITS
)
2106 return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA
);
2108 mbedtls_mpi_init( &Y
);
2110 n
= BITS_TO_LIMBS( nbits
);
2112 MBEDTLS_MPI_CHK( mbedtls_mpi_fill_random( X
, n
* ciL
, f_rng
, p_rng
) );
2114 k
= mbedtls_mpi_bitlen( X
);
2115 if( k
> nbits
) MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( X
, k
- nbits
+ 1 ) );
2117 mbedtls_mpi_set_bit( X
, nbits
-1, 1 );
2123 while( ( ret
= mbedtls_mpi_is_prime( X
, f_rng
, p_rng
) ) != 0 )
2125 if( ret
!= MBEDTLS_ERR_MPI_NOT_ACCEPTABLE
)
2128 MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( X
, X
, 2 ) );
2134 * An necessary condition for Y and X = 2Y + 1 to be prime
2135 * is X = 2 mod 3 (which is equivalent to Y = 2 mod 3).
2136 * Make sure it is satisfied, while keeping X = 3 mod 4
2141 MBEDTLS_MPI_CHK( mbedtls_mpi_mod_int( &r
, X
, 3 ) );
2143 MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( X
, X
, 8 ) );
2145 MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( X
, X
, 4 ) );
2147 /* Set Y = (X-1) / 2, which is X / 2 because X is odd */
2148 MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &Y
, X
) );
2149 MBEDTLS_MPI_CHK( mbedtls_mpi_shift_r( &Y
, 1 ) );
2154 * First, check small factors for X and Y
2155 * before doing Miller-Rabin on any of them
2157 if( ( ret
= mpi_check_small_factors( X
) ) == 0 &&
2158 ( ret
= mpi_check_small_factors( &Y
) ) == 0 &&
2159 ( ret
= mpi_miller_rabin( X
, f_rng
, p_rng
) ) == 0 &&
2160 ( ret
= mpi_miller_rabin( &Y
, f_rng
, p_rng
) ) == 0 )
2165 if( ret
!= MBEDTLS_ERR_MPI_NOT_ACCEPTABLE
)
2169 * Next candidates. We want to preserve Y = (X-1) / 2 and
2170 * Y = 1 mod 2 and Y = 2 mod 3 (eq X = 3 mod 4 and X = 2 mod 3)
2171 * so up Y by 6 and X by 12.
2173 MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( X
, X
, 12 ) );
2174 MBEDTLS_MPI_CHK( mbedtls_mpi_add_int( &Y
, &Y
, 6 ) );
2180 mbedtls_mpi_free( &Y
);
2185 #endif /* MBEDTLS_GENPRIME */
2187 #if defined(MBEDTLS_SELF_TEST)
2189 #define GCD_PAIR_COUNT 3
2191 static const int gcd_pairs
[GCD_PAIR_COUNT
][3] =
2195 { 768454923, 542167814, 1 }
2201 int mbedtls_mpi_self_test( int verbose
)
2204 mbedtls_mpi A
, E
, N
, X
, Y
, U
, V
;
2206 mbedtls_mpi_init( &A
); mbedtls_mpi_init( &E
); mbedtls_mpi_init( &N
); mbedtls_mpi_init( &X
);
2207 mbedtls_mpi_init( &Y
); mbedtls_mpi_init( &U
); mbedtls_mpi_init( &V
);
2209 MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &A
, 16,
2210 "EFE021C2645FD1DC586E69184AF4A31E" \
2211 "D5F53E93B5F123FA41680867BA110131" \
2212 "944FE7952E2517337780CB0DB80E61AA" \
2213 "E7C8DDC6C5C6AADEB34EB38A2F40D5E6" ) );
2215 MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &E
, 16,
2216 "B2E7EFD37075B9F03FF989C7C5051C20" \
2217 "34D2A323810251127E7BF8625A4F49A5" \
2218 "F3E27F4DA8BD59C47D6DAABA4C8127BD" \
2219 "5B5C25763222FEFCCFC38B832366C29E" ) );
2221 MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &N
, 16,
2222 "0066A198186C18C10B2F5ED9B522752A" \
2223 "9830B69916E535C8F047518A889A43A5" \
2224 "94B6BED27A168D31D4A52F88925AA8F5" ) );
2226 MBEDTLS_MPI_CHK( mbedtls_mpi_mul_mpi( &X
, &A
, &N
) );
2228 MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &U
, 16,
2229 "602AB7ECA597A3D6B56FF9829A5E8B85" \
2230 "9E857EA95A03512E2BAE7391688D264A" \
2231 "A5663B0341DB9CCFD2C4C5F421FEC814" \
2232 "8001B72E848A38CAE1C65F78E56ABDEF" \
2233 "E12D3C039B8A02D6BE593F0BBBDA56F1" \
2234 "ECF677152EF804370C1A305CAF3B5BF1" \
2235 "30879B56C61DE584A0F53A2447A51E" ) );
2238 mbedtls_printf( " MPI test #1 (mul_mpi): " );
2240 if( mbedtls_mpi_cmp_mpi( &X
, &U
) != 0 )
2243 mbedtls_printf( "failed\n" );
2250 mbedtls_printf( "passed\n" );
2252 MBEDTLS_MPI_CHK( mbedtls_mpi_div_mpi( &X
, &Y
, &A
, &N
) );
2254 MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &U
, 16,
2255 "256567336059E52CAE22925474705F39A94" ) );
2257 MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &V
, 16,
2258 "6613F26162223DF488E9CD48CC132C7A" \
2259 "0AC93C701B001B092E4E5B9F73BCD27B" \
2260 "9EE50D0657C77F374E903CDFA4C642" ) );
2263 mbedtls_printf( " MPI test #2 (div_mpi): " );
2265 if( mbedtls_mpi_cmp_mpi( &X
, &U
) != 0 ||
2266 mbedtls_mpi_cmp_mpi( &Y
, &V
) != 0 )
2269 mbedtls_printf( "failed\n" );
2276 mbedtls_printf( "passed\n" );
2278 MBEDTLS_MPI_CHK( mbedtls_mpi_exp_mod( &X
, &A
, &E
, &N
, NULL
) );
2280 MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &U
, 16,
2281 "36E139AEA55215609D2816998ED020BB" \
2282 "BD96C37890F65171D948E9BC7CBAA4D9" \
2283 "325D24D6A3C12710F10A09FA08AB87" ) );
2286 mbedtls_printf( " MPI test #3 (exp_mod): " );
2288 if( mbedtls_mpi_cmp_mpi( &X
, &U
) != 0 )
2291 mbedtls_printf( "failed\n" );
2298 mbedtls_printf( "passed\n" );
2300 MBEDTLS_MPI_CHK( mbedtls_mpi_inv_mod( &X
, &A
, &N
) );
2302 MBEDTLS_MPI_CHK( mbedtls_mpi_read_string( &U
, 16,
2303 "003A0AAEDD7E784FC07D8F9EC6E3BFD5" \
2304 "C3DBA76456363A10869622EAC2DD84EC" \
2305 "C5B8A74DAC4D09E03B5E0BE779F2DF61" ) );
2308 mbedtls_printf( " MPI test #4 (inv_mod): " );
2310 if( mbedtls_mpi_cmp_mpi( &X
, &U
) != 0 )
2313 mbedtls_printf( "failed\n" );
2320 mbedtls_printf( "passed\n" );
2323 mbedtls_printf( " MPI test #5 (simple gcd): " );
2325 for( i
= 0; i
< GCD_PAIR_COUNT
; i
++ )
2327 MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &X
, gcd_pairs
[i
][0] ) );
2328 MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &Y
, gcd_pairs
[i
][1] ) );
2330 MBEDTLS_MPI_CHK( mbedtls_mpi_gcd( &A
, &X
, &Y
) );
2332 if( mbedtls_mpi_cmp_int( &A
, gcd_pairs
[i
][2] ) != 0 )
2335 mbedtls_printf( "failed at %d\n", i
);
2343 mbedtls_printf( "passed\n" );
2347 if( ret
!= 0 && verbose
!= 0 )
2348 mbedtls_printf( "Unexpected error, return code = %08X\n", ret
);
2350 mbedtls_mpi_free( &A
); mbedtls_mpi_free( &E
); mbedtls_mpi_free( &N
); mbedtls_mpi_free( &X
);
2351 mbedtls_mpi_free( &Y
); mbedtls_mpi_free( &U
); mbedtls_mpi_free( &V
);
2354 mbedtls_printf( "\n" );
2359 #endif /* MBEDTLS_SELF_TEST */
2361 #endif /* MBEDTLS_BIGNUM_C */