diff --git a/include/mbedtls/mbedtls_config.h b/include/mbedtls/mbedtls_config.h index bb6708e03..ed85e3fd4 100644 --- a/include/mbedtls/mbedtls_config.h +++ b/include/mbedtls/mbedtls_config.h @@ -2012,6 +2012,7 @@ * Module: library/bignum.c * library/bignum_new.c * library/bignum_core.c + * library/bignum_mod_raw.c * Caller: library/dhm.c * library/ecp.c * library/ecdsa.c diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index bef0dbf80..2920c555c 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -20,6 +20,7 @@ set(src_crypto bignum.c bignum_new.c bignum_core.c + bignum_mod_raw.c camellia.c ccm.c chacha20.c diff --git a/library/Makefile b/library/Makefile index a1c4bb9d6..621087830 100644 --- a/library/Makefile +++ b/library/Makefile @@ -85,6 +85,7 @@ OBJS_CRYPTO= \ bignum.o \ bignum_new.o \ bignum_core.o \ + bignum_mod_raw.o \ camellia.o \ ccm.o \ chacha20.o \ diff --git a/library/bignum_mod_raw.c b/library/bignum_mod_raw.c new file mode 100644 index 000000000..305cec19b --- /dev/null +++ b/library/bignum_mod_raw.c @@ -0,0 +1,90 @@ +/* + * Multi-precision integer library + * + * Copyright The Mbed TLS Contributors + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "common.h" + +#if defined(MBEDTLS_BIGNUM_C) + +#include + +#include "mbedtls/error.h" +#include "mbedtls/platform_util.h" + +#if defined(MBEDTLS_PLATFORM_C) +#include "mbedtls/platform.h" +#else +#include +#include +#define mbedtls_printf printf +#define mbedtls_calloc calloc +#define mbedtls_free free +#endif + +#include "bignum_core.h" +#include "bignum_mod_raw.h" +#include "bignum_mod.h" +#include "constant_time_internal.h" + +int mbedtls_mpi_mod_raw_read( mbedtls_mpi_uint *X, + mbedtls_mpi_mod_modulus *m, + unsigned char *buf, + size_t buflen ) +{ + int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + if( m->ext_rep == MBEDTLS_MPI_MOD_EXT_REP_LE ) + ret = mbedtls_mpi_core_read_le( X, m->n, buf, buflen ); + + else if( m->ext_rep == MBEDTLS_MPI_MOD_EXT_REP_BE ) + ret = mbedtls_mpi_core_read_be( X, m->n, buf, buflen ); + else + return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); + + if( ret != 0 ) + goto cleanup; + + if( !mbedtls_mpi_core_lt_ct( X, m->p, m->n ) ) + { + ret = MBEDTLS_ERR_MPI_BAD_INPUT_DATA; + goto cleanup; + } + +cleanup: + + return( ret ); +} + +int mbedtls_mpi_mod_raw_write( mbedtls_mpi_uint *X, + mbedtls_mpi_mod_modulus *m, + unsigned char *buf, + size_t buflen ) +{ + if( m->ext_rep == MBEDTLS_MPI_MOD_EXT_REP_LE ) + return mbedtls_mpi_core_write_le( X, m->n, buf, buflen ); + + else if( m->ext_rep == MBEDTLS_MPI_MOD_EXT_REP_BE ) + return mbedtls_mpi_core_write_be( X, m->n, buf, buflen ); + + else + return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); + + return( 0 ); +} + +#endif /* MBEDTLS_BIGNUM_C */ diff --git a/library/bignum_mod_raw.h b/library/bignum_mod_raw.h index 85ca533da..a6c535b80 100644 --- a/library/bignum_mod_raw.h +++ b/library/bignum_mod_raw.h @@ -26,6 +26,8 @@ #include "mbedtls/bignum.h" #endif +#include "bignum_mod.h" + /** Import X from unsigned binary data. * * The MPI needs to have enough limbs to store the full value (in particular, diff --git a/library/bignum_new.c b/library/bignum_new.c index 8b23f139f..5ff55aaf8 100644 --- a/library/bignum_new.c +++ b/library/bignum_new.c @@ -149,50 +149,4 @@ exit: return( ret ); } -int mbedtls_mpi_mod_raw_read( mbedtls_mpi_uint *X, - mbedtls_mpi_mod_modulus *m, - unsigned char *buf, - size_t buflen ) -{ - int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; - - if( m->ext_rep == MBEDTLS_MPI_MOD_EXT_REP_LE ) - ret = mbedtls_mpi_core_read_le( X, m->n, buf, buflen ); - - else if( m->ext_rep == MBEDTLS_MPI_MOD_EXT_REP_BE ) - ret = mbedtls_mpi_core_read_be( X, m->n, buf, buflen ); - else - return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); - - if( ret != 0 ) - goto cleanup; - - if( !mbedtls_mpi_core_lt_ct( X, m->p, m->n ) ) - { - ret = MBEDTLS_ERR_MPI_BAD_INPUT_DATA; - goto cleanup; - } - -cleanup: - - return( ret ); -} - -int mbedtls_mpi_mod_raw_write( mbedtls_mpi_uint *X, - mbedtls_mpi_mod_modulus *m, - unsigned char *buf, - size_t buflen ) -{ - if( m->ext_rep == MBEDTLS_MPI_MOD_EXT_REP_LE ) - return mbedtls_mpi_core_write_le( X, m->n, buf, buflen ); - - else if( m->ext_rep == MBEDTLS_MPI_MOD_EXT_REP_BE ) - return mbedtls_mpi_core_write_be( X, m->n, buf, buflen ); - - else - return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); - - return( 0 ); -} - #endif /* MBEDTLS_BIGNUM_C */