xref: /optee_os/lib/libmbedtls/mbedtls/include/mbedtls/ecdh.h (revision 32b3180828fa15a49ccc86ecb4be9d274c140c89)
1817466cbSJens Wiklander /**
2817466cbSJens Wiklander  * \file ecdh.h
3817466cbSJens Wiklander  *
43d3b0591SJens Wiklander  * \brief This file contains ECDH definitions and functions.
5817466cbSJens Wiklander  *
63d3b0591SJens Wiklander  * The Elliptic Curve Diffie-Hellman (ECDH) protocol is an anonymous
73d3b0591SJens Wiklander  * key agreement protocol allowing two parties to establish a shared
83d3b0591SJens Wiklander  * secret over an insecure channel. Each party must have an
93d3b0591SJens Wiklander  * elliptic-curve public–private key pair.
103d3b0591SJens Wiklander  *
113d3b0591SJens Wiklander  * For more information, see <em>NIST SP 800-56A Rev. 2: Recommendation for
123d3b0591SJens Wiklander  * Pair-Wise Key Establishment Schemes Using Discrete Logarithm
133d3b0591SJens Wiklander  * Cryptography</em>.
143d3b0591SJens Wiklander  */
153d3b0591SJens Wiklander /*
167901324dSJerome Forissier  *  Copyright The Mbed TLS Contributors
177901324dSJerome Forissier  *  SPDX-License-Identifier: Apache-2.0
18817466cbSJens Wiklander  *
19817466cbSJens Wiklander  *  Licensed under the Apache License, Version 2.0 (the "License"); you may
20817466cbSJens Wiklander  *  not use this file except in compliance with the License.
21817466cbSJens Wiklander  *  You may obtain a copy of the License at
22817466cbSJens Wiklander  *
23817466cbSJens Wiklander  *  http://www.apache.org/licenses/LICENSE-2.0
24817466cbSJens Wiklander  *
25817466cbSJens Wiklander  *  Unless required by applicable law or agreed to in writing, software
26817466cbSJens Wiklander  *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
27817466cbSJens Wiklander  *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
28817466cbSJens Wiklander  *  See the License for the specific language governing permissions and
29817466cbSJens Wiklander  *  limitations under the License.
30817466cbSJens Wiklander  */
313d3b0591SJens Wiklander 
32817466cbSJens Wiklander #ifndef MBEDTLS_ECDH_H
33817466cbSJens Wiklander #define MBEDTLS_ECDH_H
34*32b31808SJens Wiklander #include "mbedtls/private_access.h"
35817466cbSJens Wiklander 
36*32b31808SJens Wiklander #include "mbedtls/build_info.h"
375b25c76aSJerome Forissier 
3811fa71b9SJerome Forissier #include "mbedtls/ecp.h"
39817466cbSJens Wiklander 
40*32b31808SJens Wiklander /*
41*32b31808SJens Wiklander  * Mbed TLS supports two formats for ECDH contexts (#mbedtls_ecdh_context
42*32b31808SJens Wiklander  * defined in `ecdh.h`). For most applications, the choice of format makes
43*32b31808SJens Wiklander  * no difference, since all library functions can work with either format,
44*32b31808SJens Wiklander  * except that the new format is incompatible with MBEDTLS_ECP_RESTARTABLE.
45*32b31808SJens Wiklander 
46*32b31808SJens Wiklander  * The new format used when this option is disabled is smaller
47*32b31808SJens Wiklander  * (56 bytes on a 32-bit platform). In future versions of the library, it
48*32b31808SJens Wiklander  * will support alternative implementations of ECDH operations.
49*32b31808SJens Wiklander  * The new format is incompatible with applications that access
50*32b31808SJens Wiklander  * context fields directly and with restartable ECP operations.
51*32b31808SJens Wiklander  */
52*32b31808SJens Wiklander 
53*32b31808SJens Wiklander #if defined(MBEDTLS_ECP_RESTARTABLE)
54*32b31808SJens Wiklander #define MBEDTLS_ECDH_LEGACY_CONTEXT
55*32b31808SJens Wiklander #else
56*32b31808SJens Wiklander #undef MBEDTLS_ECDH_LEGACY_CONTEXT
57*32b31808SJens Wiklander #endif
58*32b31808SJens Wiklander 
5911fa71b9SJerome Forissier #if defined(MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED)
6011fa71b9SJerome Forissier #undef MBEDTLS_ECDH_LEGACY_CONTEXT
6111fa71b9SJerome Forissier #include "everest/everest.h"
6211fa71b9SJerome Forissier #endif
633d3b0591SJens Wiklander 
64817466cbSJens Wiklander #ifdef __cplusplus
65817466cbSJens Wiklander extern "C" {
66817466cbSJens Wiklander #endif
67817466cbSJens Wiklander 
68817466cbSJens Wiklander /**
693d3b0591SJens Wiklander  * Defines the source of the imported EC key.
70817466cbSJens Wiklander  */
71*32b31808SJens Wiklander typedef enum {
723d3b0591SJens Wiklander     MBEDTLS_ECDH_OURS,   /**< Our key. */
733d3b0591SJens Wiklander     MBEDTLS_ECDH_THEIRS, /**< The key of the peer. */
74817466cbSJens Wiklander } mbedtls_ecdh_side;
75817466cbSJens Wiklander 
763d3b0591SJens Wiklander #if !defined(MBEDTLS_ECDH_LEGACY_CONTEXT)
77817466cbSJens Wiklander /**
783d3b0591SJens Wiklander  * Defines the ECDH implementation used.
793d3b0591SJens Wiklander  *
803d3b0591SJens Wiklander  * Later versions of the library may add new variants, therefore users should
813d3b0591SJens Wiklander  * not make any assumptions about them.
82817466cbSJens Wiklander  */
83*32b31808SJens Wiklander typedef enum {
843d3b0591SJens Wiklander     MBEDTLS_ECDH_VARIANT_NONE = 0,   /*!< Implementation not defined. */
853d3b0591SJens Wiklander     MBEDTLS_ECDH_VARIANT_MBEDTLS_2_0,/*!< The default Mbed TLS implementation */
8611fa71b9SJerome Forissier #if defined(MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED)
8711fa71b9SJerome Forissier     MBEDTLS_ECDH_VARIANT_EVEREST     /*!< Everest implementation */
8811fa71b9SJerome Forissier #endif
893d3b0591SJens Wiklander } mbedtls_ecdh_variant;
903d3b0591SJens Wiklander 
913d3b0591SJens Wiklander /**
923d3b0591SJens Wiklander  * The context used by the default ECDH implementation.
933d3b0591SJens Wiklander  *
943d3b0591SJens Wiklander  * Later versions might change the structure of this context, therefore users
953d3b0591SJens Wiklander  * should not make any assumptions about the structure of
963d3b0591SJens Wiklander  * mbedtls_ecdh_context_mbed.
973d3b0591SJens Wiklander  */
98*32b31808SJens Wiklander typedef struct mbedtls_ecdh_context_mbed {
99*32b31808SJens Wiklander     mbedtls_ecp_group MBEDTLS_PRIVATE(grp);   /*!< The elliptic curve used. */
100*32b31808SJens Wiklander     mbedtls_mpi MBEDTLS_PRIVATE(d);           /*!< The private key. */
101*32b31808SJens Wiklander     mbedtls_ecp_point MBEDTLS_PRIVATE(Q);     /*!< The public key. */
102*32b31808SJens Wiklander     mbedtls_ecp_point MBEDTLS_PRIVATE(Qp);    /*!< The value of the public key of the peer. */
103*32b31808SJens Wiklander     mbedtls_mpi MBEDTLS_PRIVATE(z);           /*!< The shared secret. */
1043d3b0591SJens Wiklander #if defined(MBEDTLS_ECP_RESTARTABLE)
105*32b31808SJens Wiklander     mbedtls_ecp_restart_ctx MBEDTLS_PRIVATE(rs); /*!< The restart context for EC computations. */
1063d3b0591SJens Wiklander #endif
1073d3b0591SJens Wiklander } mbedtls_ecdh_context_mbed;
1083d3b0591SJens Wiklander #endif
1093d3b0591SJens Wiklander 
1103d3b0591SJens Wiklander /**
1113d3b0591SJens Wiklander  *
1123d3b0591SJens Wiklander  * \warning         Performing multiple operations concurrently on the same
1133d3b0591SJens Wiklander  *                  ECDSA context is not supported; objects of this type
1143d3b0591SJens Wiklander  *                  should not be shared between multiple threads.
1153d3b0591SJens Wiklander  * \brief           The ECDH context structure.
1163d3b0591SJens Wiklander  */
117*32b31808SJens Wiklander typedef struct mbedtls_ecdh_context {
1183d3b0591SJens Wiklander #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT)
119*32b31808SJens Wiklander     mbedtls_ecp_group MBEDTLS_PRIVATE(grp);   /*!< The elliptic curve used. */
120*32b31808SJens Wiklander     mbedtls_mpi MBEDTLS_PRIVATE(d);           /*!< The private key. */
121*32b31808SJens Wiklander     mbedtls_ecp_point MBEDTLS_PRIVATE(Q);     /*!< The public key. */
122*32b31808SJens Wiklander     mbedtls_ecp_point MBEDTLS_PRIVATE(Qp);    /*!< The value of the public key of the peer. */
123*32b31808SJens Wiklander     mbedtls_mpi MBEDTLS_PRIVATE(z);           /*!< The shared secret. */
124*32b31808SJens Wiklander     int MBEDTLS_PRIVATE(point_format);        /*!< The format of point export in TLS messages. */
125*32b31808SJens Wiklander     mbedtls_ecp_point MBEDTLS_PRIVATE(Vi);    /*!< The blinding value. */
126*32b31808SJens Wiklander     mbedtls_ecp_point MBEDTLS_PRIVATE(Vf);    /*!< The unblinding value. */
127*32b31808SJens Wiklander     mbedtls_mpi MBEDTLS_PRIVATE(_d);          /*!< The previous \p d. */
1283d3b0591SJens Wiklander #if defined(MBEDTLS_ECP_RESTARTABLE)
129*32b31808SJens Wiklander     int MBEDTLS_PRIVATE(restart_enabled);        /*!< The flag for restartable mode. */
130*32b31808SJens Wiklander     mbedtls_ecp_restart_ctx MBEDTLS_PRIVATE(rs); /*!< The restart context for EC computations. */
1313d3b0591SJens Wiklander #endif /* MBEDTLS_ECP_RESTARTABLE */
1323d3b0591SJens Wiklander #else
133*32b31808SJens Wiklander     uint8_t MBEDTLS_PRIVATE(point_format);       /*!< The format of point export in TLS messages
1343d3b0591SJens Wiklander                                                     as defined in RFC 4492. */
135*32b31808SJens Wiklander     mbedtls_ecp_group_id MBEDTLS_PRIVATE(grp_id);/*!< The elliptic curve used. */
136*32b31808SJens Wiklander     mbedtls_ecdh_variant MBEDTLS_PRIVATE(var);   /*!< The ECDH implementation/structure used. */
137*32b31808SJens Wiklander     union {
138*32b31808SJens Wiklander         mbedtls_ecdh_context_mbed   MBEDTLS_PRIVATE(mbed_ecdh);
13911fa71b9SJerome Forissier #if defined(MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED)
140*32b31808SJens Wiklander         mbedtls_ecdh_context_everest MBEDTLS_PRIVATE(everest_ecdh);
14111fa71b9SJerome Forissier #endif
142*32b31808SJens Wiklander     } MBEDTLS_PRIVATE(ctx);                      /*!< Implementation-specific context. The
1433d3b0591SJens Wiklander                                                     context in use is specified by the \c var
1443d3b0591SJens Wiklander                                                     field. */
1453d3b0591SJens Wiklander #if defined(MBEDTLS_ECP_RESTARTABLE)
146*32b31808SJens Wiklander     uint8_t MBEDTLS_PRIVATE(restart_enabled);    /*!< The flag for restartable mode. Functions of
1473d3b0591SJens Wiklander                                                     an alternative implementation not supporting
1483d3b0591SJens Wiklander                                                     restartable mode must return
1493d3b0591SJens Wiklander                                                     MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED error
1503d3b0591SJens Wiklander                                                     if this flag is set. */
1513d3b0591SJens Wiklander #endif /* MBEDTLS_ECP_RESTARTABLE */
1523d3b0591SJens Wiklander #endif /* MBEDTLS_ECDH_LEGACY_CONTEXT */
153817466cbSJens Wiklander }
154817466cbSJens Wiklander mbedtls_ecdh_context;
155817466cbSJens Wiklander 
156817466cbSJens Wiklander /**
15711fa71b9SJerome Forissier  * \brief          Check whether a given group can be used for ECDH.
15811fa71b9SJerome Forissier  *
15911fa71b9SJerome Forissier  * \param gid      The ECP group ID to check.
16011fa71b9SJerome Forissier  *
16111fa71b9SJerome Forissier  * \return         \c 1 if the group can be used, \c 0 otherwise
16211fa71b9SJerome Forissier  */
16311fa71b9SJerome Forissier int mbedtls_ecdh_can_do(mbedtls_ecp_group_id gid);
16411fa71b9SJerome Forissier 
16511fa71b9SJerome Forissier /**
1663d3b0591SJens Wiklander  * \brief           This function generates an ECDH keypair on an elliptic
1673d3b0591SJens Wiklander  *                  curve.
168817466cbSJens Wiklander  *
1693d3b0591SJens Wiklander  *                  This function performs the first of two core computations
1703d3b0591SJens Wiklander  *                  implemented during the ECDH key exchange. The second core
1713d3b0591SJens Wiklander  *                  computation is performed by mbedtls_ecdh_compute_shared().
172817466cbSJens Wiklander  *
1733d3b0591SJens Wiklander  * \see             ecp.h
1743d3b0591SJens Wiklander  *
1753d3b0591SJens Wiklander  * \param grp       The ECP group to use. This must be initialized and have
1763d3b0591SJens Wiklander  *                  domain parameters loaded, for example through
1773d3b0591SJens Wiklander  *                  mbedtls_ecp_load() or mbedtls_ecp_tls_read_group().
1783d3b0591SJens Wiklander  * \param d         The destination MPI (private key).
1793d3b0591SJens Wiklander  *                  This must be initialized.
1803d3b0591SJens Wiklander  * \param Q         The destination point (public key).
1813d3b0591SJens Wiklander  *                  This must be initialized.
1823d3b0591SJens Wiklander  * \param f_rng     The RNG function to use. This must not be \c NULL.
1833d3b0591SJens Wiklander  * \param p_rng     The RNG context to be passed to \p f_rng. This may be
1843d3b0591SJens Wiklander  *                  \c NULL in case \p f_rng doesn't need a context argument.
1853d3b0591SJens Wiklander  *
1863d3b0591SJens Wiklander  * \return          \c 0 on success.
1873d3b0591SJens Wiklander  * \return          Another \c MBEDTLS_ERR_ECP_XXX or
1883d3b0591SJens Wiklander  *                  \c MBEDTLS_MPI_XXX error code on failure.
189817466cbSJens Wiklander  */
190817466cbSJens Wiklander int mbedtls_ecdh_gen_public(mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q,
191817466cbSJens Wiklander                             int (*f_rng)(void *, unsigned char *, size_t),
192817466cbSJens Wiklander                             void *p_rng);
193817466cbSJens Wiklander 
194817466cbSJens Wiklander /**
1953d3b0591SJens Wiklander  * \brief           This function computes the shared secret.
196817466cbSJens Wiklander  *
1973d3b0591SJens Wiklander  *                  This function performs the second of two core computations
1983d3b0591SJens Wiklander  *                  implemented during the ECDH key exchange. The first core
1993d3b0591SJens Wiklander  *                  computation is performed by mbedtls_ecdh_gen_public().
200817466cbSJens Wiklander  *
2013d3b0591SJens Wiklander  * \see             ecp.h
202817466cbSJens Wiklander  *
2033d3b0591SJens Wiklander  * \note            If \p f_rng is not NULL, it is used to implement
2043d3b0591SJens Wiklander  *                  countermeasures against side-channel attacks.
2053d3b0591SJens Wiklander  *                  For more information, see mbedtls_ecp_mul().
2063d3b0591SJens Wiklander  *
2073d3b0591SJens Wiklander  * \param grp       The ECP group to use. This must be initialized and have
2083d3b0591SJens Wiklander  *                  domain parameters loaded, for example through
2093d3b0591SJens Wiklander  *                  mbedtls_ecp_load() or mbedtls_ecp_tls_read_group().
2103d3b0591SJens Wiklander  * \param z         The destination MPI (shared secret).
2113d3b0591SJens Wiklander  *                  This must be initialized.
2123d3b0591SJens Wiklander  * \param Q         The public key from another party.
2133d3b0591SJens Wiklander  *                  This must be initialized.
2143d3b0591SJens Wiklander  * \param d         Our secret exponent (private key).
2153d3b0591SJens Wiklander  *                  This must be initialized.
216*32b31808SJens Wiklander  * \param f_rng     The RNG function to use. This must not be \c NULL.
2173d3b0591SJens Wiklander  * \param p_rng     The RNG context to be passed to \p f_rng. This may be
2183d3b0591SJens Wiklander  *                  \c NULL if \p f_rng is \c NULL or doesn't need a
2193d3b0591SJens Wiklander  *                  context argument.
2203d3b0591SJens Wiklander  *
2213d3b0591SJens Wiklander  * \return          \c 0 on success.
2223d3b0591SJens Wiklander  * \return          Another \c MBEDTLS_ERR_ECP_XXX or
2233d3b0591SJens Wiklander  *                  \c MBEDTLS_MPI_XXX error code on failure.
224817466cbSJens Wiklander  */
225817466cbSJens Wiklander int mbedtls_ecdh_compute_shared(mbedtls_ecp_group *grp, mbedtls_mpi *z,
226817466cbSJens Wiklander                                 const mbedtls_ecp_point *Q, const mbedtls_mpi *d,
227817466cbSJens Wiklander                                 int (*f_rng)(void *, unsigned char *, size_t),
228817466cbSJens Wiklander                                 void *p_rng);
229817466cbSJens Wiklander 
230817466cbSJens Wiklander /**
2313d3b0591SJens Wiklander  * \brief           This function initializes an ECDH context.
232817466cbSJens Wiklander  *
2333d3b0591SJens Wiklander  * \param ctx       The ECDH context to initialize. This must not be \c NULL.
234817466cbSJens Wiklander  */
235817466cbSJens Wiklander void mbedtls_ecdh_init(mbedtls_ecdh_context *ctx);
236817466cbSJens Wiklander 
237817466cbSJens Wiklander /**
2383d3b0591SJens Wiklander  * \brief           This function sets up the ECDH context with the information
2393d3b0591SJens Wiklander  *                  given.
240817466cbSJens Wiklander  *
2413d3b0591SJens Wiklander  *                  This function should be called after mbedtls_ecdh_init() but
2423d3b0591SJens Wiklander  *                  before mbedtls_ecdh_make_params(). There is no need to call
2433d3b0591SJens Wiklander  *                  this function before mbedtls_ecdh_read_params().
2443d3b0591SJens Wiklander  *
2453d3b0591SJens Wiklander  *                  This is the first function used by a TLS server for ECDHE
2463d3b0591SJens Wiklander  *                  ciphersuites.
2473d3b0591SJens Wiklander  *
2483d3b0591SJens Wiklander  * \param ctx       The ECDH context to set up. This must be initialized.
2493d3b0591SJens Wiklander  * \param grp_id    The group id of the group to set up the context for.
2503d3b0591SJens Wiklander  *
2513d3b0591SJens Wiklander  * \return          \c 0 on success.
2523d3b0591SJens Wiklander  */
2533d3b0591SJens Wiklander int mbedtls_ecdh_setup(mbedtls_ecdh_context *ctx,
2543d3b0591SJens Wiklander                        mbedtls_ecp_group_id grp_id);
2553d3b0591SJens Wiklander 
2563d3b0591SJens Wiklander /**
2573d3b0591SJens Wiklander  * \brief           This function frees a context.
2583d3b0591SJens Wiklander  *
2593d3b0591SJens Wiklander  * \param ctx       The context to free. This may be \c NULL, in which
2603d3b0591SJens Wiklander  *                  case this function does nothing. If it is not \c NULL,
2613d3b0591SJens Wiklander  *                  it must point to an initialized ECDH context.
262817466cbSJens Wiklander  */
263817466cbSJens Wiklander void mbedtls_ecdh_free(mbedtls_ecdh_context *ctx);
264817466cbSJens Wiklander 
265817466cbSJens Wiklander /**
2663d3b0591SJens Wiklander  * \brief           This function generates an EC key pair and exports its
2673d3b0591SJens Wiklander  *                  in the format used in a TLS ServerKeyExchange handshake
2683d3b0591SJens Wiklander  *                  message.
269817466cbSJens Wiklander  *
2703d3b0591SJens Wiklander  *                  This is the second function used by a TLS server for ECDHE
2713d3b0591SJens Wiklander  *                  ciphersuites. (It is called after mbedtls_ecdh_setup().)
272817466cbSJens Wiklander  *
2733d3b0591SJens Wiklander  * \see             ecp.h
274817466cbSJens Wiklander  *
2753d3b0591SJens Wiklander  * \param ctx       The ECDH context to use. This must be initialized
2763d3b0591SJens Wiklander  *                  and bound to a group, for example via mbedtls_ecdh_setup().
2773d3b0591SJens Wiklander  * \param olen      The address at which to store the number of Bytes written.
2783d3b0591SJens Wiklander  * \param buf       The destination buffer. This must be a writable buffer of
2793d3b0591SJens Wiklander  *                  length \p blen Bytes.
2803d3b0591SJens Wiklander  * \param blen      The length of the destination buffer \p buf in Bytes.
2813d3b0591SJens Wiklander  * \param f_rng     The RNG function to use. This must not be \c NULL.
2823d3b0591SJens Wiklander  * \param p_rng     The RNG context to be passed to \p f_rng. This may be
2833d3b0591SJens Wiklander  *                  \c NULL in case \p f_rng doesn't need a context argument.
2843d3b0591SJens Wiklander  *
2853d3b0591SJens Wiklander  * \return          \c 0 on success.
2863d3b0591SJens Wiklander  * \return          #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of
2873d3b0591SJens Wiklander  *                  operations was reached: see \c mbedtls_ecp_set_max_ops().
2883d3b0591SJens Wiklander  * \return          Another \c MBEDTLS_ERR_ECP_XXX error code on failure.
289817466cbSJens Wiklander  */
290817466cbSJens Wiklander int mbedtls_ecdh_make_params(mbedtls_ecdh_context *ctx, size_t *olen,
291817466cbSJens Wiklander                              unsigned char *buf, size_t blen,
292817466cbSJens Wiklander                              int (*f_rng)(void *, unsigned char *, size_t),
293817466cbSJens Wiklander                              void *p_rng);
294817466cbSJens Wiklander 
295817466cbSJens Wiklander /**
2963d3b0591SJens Wiklander  * \brief           This function parses the ECDHE parameters in a
2973d3b0591SJens Wiklander  *                  TLS ServerKeyExchange handshake message.
298817466cbSJens Wiklander  *
2993d3b0591SJens Wiklander  * \note            In a TLS handshake, this is the how the client
3003d3b0591SJens Wiklander  *                  sets up its ECDHE context from the server's public
3013d3b0591SJens Wiklander  *                  ECDHE key material.
302817466cbSJens Wiklander  *
3033d3b0591SJens Wiklander  * \see             ecp.h
3043d3b0591SJens Wiklander  *
3053d3b0591SJens Wiklander  * \param ctx       The ECDHE context to use. This must be initialized.
3063d3b0591SJens Wiklander  * \param buf       On input, \c *buf must be the start of the input buffer.
3073d3b0591SJens Wiklander  *                  On output, \c *buf is updated to point to the end of the
3083d3b0591SJens Wiklander  *                  data that has been read. On success, this is the first byte
3093d3b0591SJens Wiklander  *                  past the end of the ServerKeyExchange parameters.
3103d3b0591SJens Wiklander  *                  On error, this is the point at which an error has been
3113d3b0591SJens Wiklander  *                  detected, which is usually not useful except to debug
3123d3b0591SJens Wiklander  *                  failures.
3133d3b0591SJens Wiklander  * \param end       The end of the input buffer.
3143d3b0591SJens Wiklander  *
3153d3b0591SJens Wiklander  * \return          \c 0 on success.
3163d3b0591SJens Wiklander  * \return          An \c MBEDTLS_ERR_ECP_XXX error code on failure.
3173d3b0591SJens Wiklander  *
318817466cbSJens Wiklander  */
319817466cbSJens Wiklander int mbedtls_ecdh_read_params(mbedtls_ecdh_context *ctx,
3203d3b0591SJens Wiklander                              const unsigned char **buf,
3213d3b0591SJens Wiklander                              const unsigned char *end);
322817466cbSJens Wiklander 
323817466cbSJens Wiklander /**
3243d3b0591SJens Wiklander  * \brief           This function sets up an ECDH context from an EC key.
325817466cbSJens Wiklander  *
3263d3b0591SJens Wiklander  *                  It is used by clients and servers in place of the
3273d3b0591SJens Wiklander  *                  ServerKeyEchange for static ECDH, and imports ECDH
3283d3b0591SJens Wiklander  *                  parameters from the EC key information of a certificate.
329817466cbSJens Wiklander  *
3303d3b0591SJens Wiklander  * \see             ecp.h
3313d3b0591SJens Wiklander  *
3323d3b0591SJens Wiklander  * \param ctx       The ECDH context to set up. This must be initialized.
3333d3b0591SJens Wiklander  * \param key       The EC key to use. This must be initialized.
3343d3b0591SJens Wiklander  * \param side      Defines the source of the key. Possible values are:
3353d3b0591SJens Wiklander  *                  - #MBEDTLS_ECDH_OURS: The key is ours.
3363d3b0591SJens Wiklander  *                  - #MBEDTLS_ECDH_THEIRS: The key is that of the peer.
3373d3b0591SJens Wiklander  *
3383d3b0591SJens Wiklander  * \return          \c 0 on success.
3393d3b0591SJens Wiklander  * \return          Another \c MBEDTLS_ERR_ECP_XXX error code on failure.
3403d3b0591SJens Wiklander  *
341817466cbSJens Wiklander  */
3423d3b0591SJens Wiklander int mbedtls_ecdh_get_params(mbedtls_ecdh_context *ctx,
3433d3b0591SJens Wiklander                             const mbedtls_ecp_keypair *key,
344817466cbSJens Wiklander                             mbedtls_ecdh_side side);
345817466cbSJens Wiklander 
346817466cbSJens Wiklander /**
3473d3b0591SJens Wiklander  * \brief           This function generates a public key and exports it
3483d3b0591SJens Wiklander  *                  as a TLS ClientKeyExchange payload.
349817466cbSJens Wiklander  *
3503d3b0591SJens Wiklander  *                  This is the second function used by a TLS client for ECDH(E)
3513d3b0591SJens Wiklander  *                  ciphersuites.
352817466cbSJens Wiklander  *
3533d3b0591SJens Wiklander  * \see             ecp.h
3543d3b0591SJens Wiklander  *
3553d3b0591SJens Wiklander  * \param ctx       The ECDH context to use. This must be initialized
3563d3b0591SJens Wiklander  *                  and bound to a group, the latter usually by
3573d3b0591SJens Wiklander  *                  mbedtls_ecdh_read_params().
3583d3b0591SJens Wiklander  * \param olen      The address at which to store the number of Bytes written.
3593d3b0591SJens Wiklander  *                  This must not be \c NULL.
3603d3b0591SJens Wiklander  * \param buf       The destination buffer. This must be a writable buffer
3613d3b0591SJens Wiklander  *                  of length \p blen Bytes.
3623d3b0591SJens Wiklander  * \param blen      The size of the destination buffer \p buf in Bytes.
3633d3b0591SJens Wiklander  * \param f_rng     The RNG function to use. This must not be \c NULL.
3643d3b0591SJens Wiklander  * \param p_rng     The RNG context to be passed to \p f_rng. This may be
3653d3b0591SJens Wiklander  *                  \c NULL in case \p f_rng doesn't need a context argument.
3663d3b0591SJens Wiklander  *
3673d3b0591SJens Wiklander  * \return          \c 0 on success.
3683d3b0591SJens Wiklander  * \return          #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of
3693d3b0591SJens Wiklander  *                  operations was reached: see \c mbedtls_ecp_set_max_ops().
3703d3b0591SJens Wiklander  * \return          Another \c MBEDTLS_ERR_ECP_XXX error code on failure.
371817466cbSJens Wiklander  */
372817466cbSJens Wiklander int mbedtls_ecdh_make_public(mbedtls_ecdh_context *ctx, size_t *olen,
373817466cbSJens Wiklander                              unsigned char *buf, size_t blen,
374817466cbSJens Wiklander                              int (*f_rng)(void *, unsigned char *, size_t),
375817466cbSJens Wiklander                              void *p_rng);
376817466cbSJens Wiklander 
377817466cbSJens Wiklander /**
3783d3b0591SJens Wiklander  * \brief       This function parses and processes the ECDHE payload of a
3793d3b0591SJens Wiklander  *              TLS ClientKeyExchange message.
380817466cbSJens Wiklander  *
3813d3b0591SJens Wiklander  *              This is the third function used by a TLS server for ECDH(E)
3823d3b0591SJens Wiklander  *              ciphersuites. (It is called after mbedtls_ecdh_setup() and
3833d3b0591SJens Wiklander  *              mbedtls_ecdh_make_params().)
384817466cbSJens Wiklander  *
3853d3b0591SJens Wiklander  * \see         ecp.h
3863d3b0591SJens Wiklander  *
3873d3b0591SJens Wiklander  * \param ctx   The ECDH context to use. This must be initialized
3883d3b0591SJens Wiklander  *              and bound to a group, for example via mbedtls_ecdh_setup().
3893d3b0591SJens Wiklander  * \param buf   The pointer to the ClientKeyExchange payload. This must
3903d3b0591SJens Wiklander  *              be a readable buffer of length \p blen Bytes.
3913d3b0591SJens Wiklander  * \param blen  The length of the input buffer \p buf in Bytes.
3923d3b0591SJens Wiklander  *
3933d3b0591SJens Wiklander  * \return      \c 0 on success.
3943d3b0591SJens Wiklander  * \return      An \c MBEDTLS_ERR_ECP_XXX error code on failure.
395817466cbSJens Wiklander  */
396817466cbSJens Wiklander int mbedtls_ecdh_read_public(mbedtls_ecdh_context *ctx,
397817466cbSJens Wiklander                              const unsigned char *buf, size_t blen);
398817466cbSJens Wiklander 
399817466cbSJens Wiklander /**
4003d3b0591SJens Wiklander  * \brief           This function derives and exports the shared secret.
401817466cbSJens Wiklander  *
4023d3b0591SJens Wiklander  *                  This is the last function used by both TLS client
4033d3b0591SJens Wiklander  *                  and servers.
404817466cbSJens Wiklander  *
4053d3b0591SJens Wiklander  * \note            If \p f_rng is not NULL, it is used to implement
4063d3b0591SJens Wiklander  *                  countermeasures against side-channel attacks.
4073d3b0591SJens Wiklander  *                  For more information, see mbedtls_ecp_mul().
4083d3b0591SJens Wiklander  *
4093d3b0591SJens Wiklander  * \see             ecp.h
4103d3b0591SJens Wiklander 
4113d3b0591SJens Wiklander  * \param ctx       The ECDH context to use. This must be initialized
4123d3b0591SJens Wiklander  *                  and have its own private key generated and the peer's
4133d3b0591SJens Wiklander  *                  public key imported.
4143d3b0591SJens Wiklander  * \param olen      The address at which to store the total number of
4153d3b0591SJens Wiklander  *                  Bytes written on success. This must not be \c NULL.
4163d3b0591SJens Wiklander  * \param buf       The buffer to write the generated shared key to. This
4173d3b0591SJens Wiklander  *                  must be a writable buffer of size \p blen Bytes.
4183d3b0591SJens Wiklander  * \param blen      The length of the destination buffer \p buf in Bytes.
419*32b31808SJens Wiklander  * \param f_rng     The RNG function to use. This must not be \c NULL.
4203d3b0591SJens Wiklander  * \param p_rng     The RNG context. This may be \c NULL if \p f_rng
4213d3b0591SJens Wiklander  *                  doesn't need a context argument.
4223d3b0591SJens Wiklander  *
4233d3b0591SJens Wiklander  * \return          \c 0 on success.
4243d3b0591SJens Wiklander  * \return          #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of
4253d3b0591SJens Wiklander  *                  operations was reached: see \c mbedtls_ecp_set_max_ops().
4263d3b0591SJens Wiklander  * \return          Another \c MBEDTLS_ERR_ECP_XXX error code on failure.
427817466cbSJens Wiklander  */
428817466cbSJens Wiklander int mbedtls_ecdh_calc_secret(mbedtls_ecdh_context *ctx, size_t *olen,
429817466cbSJens Wiklander                              unsigned char *buf, size_t blen,
430817466cbSJens Wiklander                              int (*f_rng)(void *, unsigned char *, size_t),
431817466cbSJens Wiklander                              void *p_rng);
432817466cbSJens Wiklander 
4333d3b0591SJens Wiklander #if defined(MBEDTLS_ECP_RESTARTABLE)
4343d3b0591SJens Wiklander /**
4353d3b0591SJens Wiklander  * \brief           This function enables restartable EC computations for this
4363d3b0591SJens Wiklander  *                  context.  (Default: disabled.)
4373d3b0591SJens Wiklander  *
4383d3b0591SJens Wiklander  * \see             \c mbedtls_ecp_set_max_ops()
4393d3b0591SJens Wiklander  *
4403d3b0591SJens Wiklander  * \note            It is not possible to safely disable restartable
4413d3b0591SJens Wiklander  *                  computations once enabled, except by free-ing the context,
4423d3b0591SJens Wiklander  *                  which cancels possible in-progress operations.
4433d3b0591SJens Wiklander  *
4443d3b0591SJens Wiklander  * \param ctx       The ECDH context to use. This must be initialized.
4453d3b0591SJens Wiklander  */
4463d3b0591SJens Wiklander void mbedtls_ecdh_enable_restart(mbedtls_ecdh_context *ctx);
4473d3b0591SJens Wiklander #endif /* MBEDTLS_ECP_RESTARTABLE */
4483d3b0591SJens Wiklander 
449817466cbSJens Wiklander #ifdef __cplusplus
450817466cbSJens Wiklander }
451817466cbSJens Wiklander #endif
452817466cbSJens Wiklander 
453817466cbSJens Wiklander #endif /* ecdh.h */
454