diff --git a/ChangeLog b/ChangeLog index 539256b86..13975519a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -26,6 +26,8 @@ Changes (Credits go to Marco Lizza) * Added POLARSSL_MPI_WINDOW_SIZE definition to allow easier time to memory trade-off + * Introduced POLARSSL_MPI_MAX_SIZE and POLARSSL_MPI_MAX_BITS for MPI size + management (Closes ticket #44) Bugfix * Fixed faulty HMAC-MD2 implementation. Found by dibac. (Closes diff --git a/include/polarssl/bignum.h b/include/polarssl/bignum.h index 1e46d126b..2b8e82314 100644 --- a/include/polarssl/bignum.h +++ b/include/polarssl/bignum.h @@ -56,6 +56,16 @@ */ #define POLARSSL_MPI_WINDOW_SIZE 6 /**< Maximum windows size used. */ +/* + * Maximum size of MPIs allowed in bits and bytes for user-MPIs. + * ( Default: 512 bytes => 4096 bits ) + * + * Note: Calculations can results temporarily in larger MPIs. So the number + * of limbs required (POLARSSL_MPI_MAX_LIMBS) is higher. + */ +#define POLARSSL_MPI_MAX_SIZE 512 /**< Maximum number of bytes for usable MPIs. */ +#define POLARSSL_MPI_MAX_BITS ( 8 * POLARSSL_MPI_MAX_SIZE ) /**< Maximum number of bits for usable MPIs. */ + /* * Define the base integer type, architecture-wise */ @@ -572,7 +582,7 @@ int mpi_is_prime( mpi *X, int (*f_rng)(void *), void *p_rng ); * \brief Prime number generation * * \param X Destination MPI - * \param nbits Required size of X in bits ( 3 <= nbits <= 4096 ) + * \param nbits Required size of X in bits ( 3 <= nbits <= POLARSSL_MPI_MAX_BITS ) * \param dh_flag If 1, then (X-1)/2 will be prime too * \param f_rng RNG function * \param p_rng RNG parameter diff --git a/library/bignum.c b/library/bignum.c index d4035b62b..36e78e165 100644 --- a/library/bignum.c +++ b/library/bignum.c @@ -440,7 +440,10 @@ int mpi_read_file( mpi *X, int radix, FILE *fin ) t_uint d; size_t slen; char *p; - char s[1024]; + /* + * Buffer should have space for (short) label and hexified MPI and '\0' + */ + char s[ 2 * POLARSSL_MPI_MAX_SIZE + 10 ]; memset( s, 0, sizeof( s ) ); if( fgets( s, sizeof( s ) - 1, fin ) == NULL ) @@ -465,7 +468,10 @@ int mpi_write_file( const char *p, const mpi *X, int radix, FILE *fout ) { int ret; size_t n, slen, plen; - char s[2048]; + /* + * Buffer should have space for minus sign, hexified MPI and '\0' + */ + char s[ 2 * POLARSSL_MPI_MAX_SIZE + 2 ]; n = sizeof( s ); memset( s, 0, n ); @@ -1867,7 +1873,7 @@ int mpi_gen_prime( mpi *X, size_t nbits, int dh_flag, size_t k, n; mpi Y; - if( nbits < 3 || nbits > 4096 ) + if( nbits < 3 || nbits > POLARSSL_MPI_MAX_BITS ) return( POLARSSL_ERR_MPI_BAD_INPUT_DATA ); mpi_init( &Y ); diff --git a/library/rsa.c b/library/rsa.c index de8e76596..8cadcadd9 100644 --- a/library/rsa.c +++ b/library/rsa.c @@ -142,7 +142,7 @@ int rsa_check_pubkey( const rsa_context *ctx ) return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED ); if( mpi_msb( &ctx->N ) < 128 || - mpi_msb( &ctx->N ) > 4096 ) + mpi_msb( &ctx->N ) > POLARSSL_MPI_MAX_BITS ) return( POLARSSL_ERR_RSA_KEY_CHECK_FAILED ); if( mpi_msb( &ctx->E ) < 2 ||