From c5328cf9a67e88c05cd2319afe3f2a201f07920c Mon Sep 17 00:00:00 2001 From: Gabor Mezei Date: Mon, 18 Jul 2022 23:13:13 +0200 Subject: [PATCH] Add a set of I/O functions for the modulus structure Signed-off-by: Gabor Mezei --- library/bignum_mod.h | 10 ++++++++++ library/bignum_mod_raw.h | 39 +++++++++++++++++++++++++++++++++++++++ library/bignum_new.c | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+) create mode 100644 library/bignum_mod_raw.h diff --git a/library/bignum_mod.h b/library/bignum_mod.h index 378c58dd47..62ecf2b0d7 100644 --- a/library/bignum_mod.h +++ b/library/bignum_mod.h @@ -49,6 +49,16 @@ typedef struct { } rep; } mbedtls_mpi_mod_modulus; +typedef enum +{ + MBEDTLS_MPI_MOD_REP_INVALID = 0, + MBEDTLS_MPI_MOD_REP_MONTGOMERY, + MBEDTLS_MPI_MOD_REP_OPT_RED +} mbedtls_mpi_mod_rep_selector; + +#define MBEDTLS_MI_MOD_EXT_REP_LE 0x1 +#define MBEDTLS_MI_MOD_EXT_REP_BE 0x2 + void mbedtls_mpi_mod_residue_release( mbedtls_mpi_mod_residue *r ); int mbedtls_mpi_mod_residue_setup( mbedtls_mpi_mod_residue *r, diff --git a/library/bignum_mod_raw.h b/library/bignum_mod_raw.h new file mode 100644 index 0000000000..8a202baa97 --- /dev/null +++ b/library/bignum_mod_raw.h @@ -0,0 +1,39 @@ +/** + * Internal bignum functions + * + * 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. + */ + +#ifndef MBEDTLS_BIGNUM_CORE_H +#define MBEDTLS_BIGNUM_CORE_H + +#include "common.h" + +#if defined(MBEDTLS_BIGNUM_C) +#include "mbedtls/bignum.h" +#endif + +int mbedtls_mpi_mod_raw_read( mbedtls_mpi_uint *X, + mbedtls_mpi_mod_modulus *m, + unsigned char *buf, + size_t buflen ); + +int mbedtls_mpi_mod_raw_write( mbedtls_mpi_uint *X, + mbedtls_mpi_mod_modulus *m, + unsigned char *buf, + size_t buflen ); + +#endif /* MBEDTLS_BIGNUM_CORE_H */ diff --git a/library/bignum_new.c b/library/bignum_new.c index 977b5d7442..976301d919 100644 --- a/library/bignum_new.c +++ b/library/bignum_new.c @@ -28,6 +28,7 @@ #include "mbedtls/bignum.h" #include "bignum_core.h" #include "bignum_mod.h" +#include "bignum_mod_raw.h" #define MPI_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_MPI_BAD_INPUT_DATA ) @@ -407,4 +408,38 @@ int mbedtls_mpi_core_write_be( const mbedtls_mpi_uint *X, return( 0 ); } +int mbedtls_mpi_mod_raw_read( mbedtls_mpi_uint *X, + mbedtls_mpi_mod_modulus *m, + unsigned char *buf, + size_t buflen ) +{ + if( m->ext_rep & MBEDTLS_MI_MOD_EXT_REP_LE ) + return mbedtls_mpi_core_read_le( X, m->n, buf, buflen ); + + else if( m->ext_rep & MBEDTLS_MI_MOD_EXT_REP_BE ) + return mbedtls_mpi_core_read_be( X, m->n, buf, buflen ); + + else + return( MBEDTLS_ERR_MPI_BAD_INPUT_DATA ); + + return( 0 ); +} + +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_MI_MOD_EXT_REP_LE ) + return mbedtls_mpi_core_write_le( X, m->n, buf, buflen ); + + else if( m->ext_rep & MBEDTLS_MI_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 */