blob: ba1c69d6b1a71331714551011f2e43172fa44570 [file] [log] [blame]
Janos Follath5f316972024-08-22 14:53:13 +01001/**
2 * \file bignum_internal.h
3 *
4 * \brief Internal-only bignum public-key cryptosystem API.
5 *
6 * This file declares bignum-related functions that are to be used
7 * only from within the Mbed TLS library itself.
8 *
9 */
10/*
11 * Copyright The Mbed TLS Contributors
12 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
13 */
14#ifndef MBEDTLS_BIGNUM_INTERNAL_H
15#define MBEDTLS_BIGNUM_INTERNAL_H
16
17/**
18 * \brief Perform a modular exponentiation: X = A^E mod N
19 *
20 * \warning This function is not constant time with respect to \p E (the exponent).
21 *
22 * \param X The destination MPI. This must point to an initialized MPI.
23 * This must not alias E or N.
24 * \param A The base of the exponentiation.
25 * This must point to an initialized MPI.
26 * \param E The exponent MPI. This must point to an initialized MPI.
27 * \param N The base for the modular reduction. This must point to an
28 * initialized MPI.
29 * \param prec_RR A helper MPI depending solely on \p N which can be used to
30 * speed-up multiple modular exponentiations for the same value
31 * of \p N. This may be \c NULL. If it is not \c NULL, it must
32 * point to an initialized MPI. If it hasn't been used after
33 * the call to mbedtls_mpi_init(), this function will compute
34 * the helper value and store it in \p prec_RR for reuse on
35 * subsequent calls to this function. Otherwise, the function
36 * will assume that \p prec_RR holds the helper value set by a
37 * previous call to mbedtls_mpi_exp_mod(), and reuse it.
38 *
39 * \return \c 0 if successful.
40 * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed.
41 * \return #MBEDTLS_ERR_MPI_BAD_INPUT_DATA if \c N is negative or
42 * even, or if \c E is negative.
43 * \return Another negative error code on different kinds of failures.
44 *
45 */
46int mbedtls_mpi_exp_mod_unsafe(mbedtls_mpi *X, const mbedtls_mpi *A,
47 const mbedtls_mpi *E, const mbedtls_mpi *N,
48 mbedtls_mpi *prec_RR);
49
Felix Conwaybd7ede32025-08-04 11:33:48 +010050/**
Felix Conwayd9c4c9c2025-08-05 14:33:32 +010051 * \brief A wrapper around a constant time function to compute
52 * GCD(A, N) and/or A^-1 mod N if it exists.
Felix Conwaybd7ede32025-08-04 11:33:48 +010053 *
Felix Conwayd9c4c9c2025-08-05 14:33:32 +010054 * \warning Requires N to be odd, and 0 <= A <= N. Additionally, if
55 * I != NULL, requires N > 1.
56 * The wrapper part of this function is not constant time.
Felix Conwaybd7ede32025-08-04 11:33:48 +010057 *
Felix Conwayd9c4c9c2025-08-05 14:33:32 +010058 * \note A and N must not alias each other.
Felix Conway54a94c12025-08-04 11:34:19 +010059 * When I == NULL (computing only the GCD), G can alias A or N.
60 * When I != NULL (computing the modular inverse), G or I can
61 * alias A, but neither of them can alias N (the modulus).
Felix Conwaybd7ede32025-08-04 11:33:48 +010062 *
63 * \param[out] G The GCD of \p A and \p N.
64 * This may be NULL, to only compute I.
65 * \param[out] I The inverse of \p A modulo \p N if it exists (that is,
Manuel Pégourié-Gonnardc6b28b32025-09-11 09:58:45 +020066 * if \p G above is 1 on exit), in the range [1, \p N);
67 * indeterminate otherwise.
Felix Conwaybd7ede32025-08-04 11:33:48 +010068 * This may be NULL, to only compute G.
69 * \param[in] A The 1st operand of GCD and number to invert.
70 * This value must be less than or equal to \p N.
71 * \param[in] N The 2nd operand of GCD and modulus for inversion.
72 * Must be odd or the results are indeterminate.
73 *
74 * \return \c 0 if successful.
75 * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed.
Felix Conway54a94c12025-08-04 11:34:19 +010076 * \return #MBEDTLS_ERR_MPI_BAD_INPUT_DATA if preconditions were not
77 * met.
Felix Conwaybd7ede32025-08-04 11:33:48 +010078 */
79int mbedtls_mpi_gcd_modinv_odd(mbedtls_mpi *G,
80 mbedtls_mpi *I,
81 const mbedtls_mpi *A,
82 const mbedtls_mpi *N);
83
Manuel Pégourié-Gonnard630148e2025-08-13 13:57:35 +020084/**
85 * \brief Modular inverse: X = A^-1 mod N with N odd
86 *
Manuel Pégourié-Gonnardc6b28b32025-09-11 09:58:45 +020087 * \param[out] X The inverse of \p A modulo \p N in the range [1, \p N)
88 * on success; indeterminate otherwise.
Manuel Pégourié-Gonnard630148e2025-08-13 13:57:35 +020089 * \param[in] A The number to invert.
90 * \param[in] N The modulus. Must be odd and greater than 1.
91 *
92 * \return \c 0 if successful.
93 * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed.
94 * \return #MBEDTLS_ERR_MPI_BAD_INPUT_DATA if preconditions were not
95 * met.
96 * \return #MBEDTLS_ERR_MPI_NOT_ACCEPTABLE if A is not invertible mod N.
97 */
98int mbedtls_mpi_inv_mod_odd(mbedtls_mpi *X,
99 const mbedtls_mpi *A,
100 const mbedtls_mpi *N);
101
Manuel Pégourié-Gonnard9e1c5322025-08-13 14:14:19 +0200102/**
103 * \brief Modular inverse: X = A^-1 mod N with N even,
104 * A odd and 1 < A < N.
105 *
Manuel Pégourié-Gonnardc6b28b32025-09-11 09:58:45 +0200106 * \param[out] X The inverse of \p A modulo \p N in the range [1, \p N)
107 * on success; indeterminate otherwise.
Manuel Pégourié-Gonnard9e1c5322025-08-13 14:14:19 +0200108 * \param[in] A The number to invert. Must be odd, greated than 1
109 * and less than \p N.
110 * \param[in] N The modulus. Must be even and greater than 1.
111 *
112 * \return \c 0 if successful.
113 * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if a memory allocation failed.
114 * \return #MBEDTLS_ERR_MPI_BAD_INPUT_DATA if preconditions were not
115 * met.
116 * \return #MBEDTLS_ERR_MPI_NOT_ACCEPTABLE if A is not invertible mod N.
117 */
118int mbedtls_mpi_inv_mod_even_in_range(mbedtls_mpi *X,
119 mbedtls_mpi const *A,
120 mbedtls_mpi const *N);
121
Janos Follath5f316972024-08-22 14:53:13 +0100122#endif /* bignum_internal.h */