diff --git a/library/ecp.c b/library/ecp.c index d9d5425ed..835bfa3bc 100644 --- a/library/ecp.c +++ b/library/ecp.c @@ -79,6 +79,8 @@ #include "bn_mul.h" #include "ecp_invasive.h" +#include "ecp_internal.h" +#include "bignum_core.h" #include @@ -1029,6 +1031,20 @@ cleanup: return ret; } +int mbedtls_ecp_quasi_reduction(mbedtls_mpi_uint *X, + const mbedtls_mpi_mod_modulus *N) +{ + if (N->limbs == 0) { + return MBEDTLS_ERR_ECP_BAD_INPUT_DATA; + } + + mbedtls_mpi_uint c = mbedtls_mpi_core_sub(X, X, N->p, N->limbs); + + (void) mbedtls_mpi_core_add_if(X, N->p, N->limbs, (unsigned) c); + + return 0; +} + /* * Fast mod-p functions expect their argument to be in the 0..p^2 range. * diff --git a/library/ecp_internal.h b/library/ecp_internal.h new file mode 100644 index 000000000..07bf3861a --- /dev/null +++ b/library/ecp_internal.h @@ -0,0 +1,34 @@ +/** + * \file ecp_internal.h + * + * \brief Function declarations for internal functions of elliptic curve + * point arithmetic. + */ +/** + * 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_ECP_INTERNAL_H +#define MBEDTLS_ECP_INTERNAL_H + +#include "common.h" +#include "mbedtls/bignum.h" +#include "bignum_mod.h" + +int mbedtls_ecp_quasi_reduction(mbedtls_mpi_uint *X, + const mbedtls_mpi_mod_modulus *N); + +#endif /* MBEDTLS_ECP_INTERNAL_H */