xref: /optee_os/lib/libmbedtls/mbedtls/include/mbedtls/ecdh.h (revision 7901324d9530594155991c8b283023d567741cc7)
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 /*
16*7901324dSJerome Forissier  *  Copyright The Mbed TLS Contributors
17*7901324dSJerome 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
34817466cbSJens Wiklander 
355b25c76aSJerome Forissier #if !defined(MBEDTLS_CONFIG_FILE)
3611fa71b9SJerome Forissier #include "mbedtls/config.h"
375b25c76aSJerome Forissier #else
385b25c76aSJerome Forissier #include MBEDTLS_CONFIG_FILE
395b25c76aSJerome Forissier #endif
405b25c76aSJerome Forissier 
4111fa71b9SJerome Forissier #include "mbedtls/ecp.h"
42817466cbSJens Wiklander 
4311fa71b9SJerome Forissier #if defined(MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED)
4411fa71b9SJerome Forissier #undef MBEDTLS_ECDH_LEGACY_CONTEXT
4511fa71b9SJerome Forissier #include "everest/everest.h"
4611fa71b9SJerome Forissier #endif
473d3b0591SJens Wiklander 
48817466cbSJens Wiklander #ifdef __cplusplus
49817466cbSJens Wiklander extern "C" {
50817466cbSJens Wiklander #endif
51817466cbSJens Wiklander 
52817466cbSJens Wiklander /**
533d3b0591SJens Wiklander  * Defines the source of the imported EC key.
54817466cbSJens Wiklander  */
55817466cbSJens Wiklander typedef enum
56817466cbSJens Wiklander {
573d3b0591SJens Wiklander     MBEDTLS_ECDH_OURS,   /**< Our key. */
583d3b0591SJens Wiklander     MBEDTLS_ECDH_THEIRS, /**< The key of the peer. */
59817466cbSJens Wiklander } mbedtls_ecdh_side;
60817466cbSJens Wiklander 
613d3b0591SJens Wiklander #if !defined(MBEDTLS_ECDH_LEGACY_CONTEXT)
62817466cbSJens Wiklander /**
633d3b0591SJens Wiklander  * Defines the ECDH implementation used.
643d3b0591SJens Wiklander  *
653d3b0591SJens Wiklander  * Later versions of the library may add new variants, therefore users should
663d3b0591SJens Wiklander  * not make any assumptions about them.
67817466cbSJens Wiklander  */
683d3b0591SJens Wiklander typedef enum
69817466cbSJens Wiklander {
703d3b0591SJens Wiklander     MBEDTLS_ECDH_VARIANT_NONE = 0,   /*!< Implementation not defined. */
713d3b0591SJens Wiklander     MBEDTLS_ECDH_VARIANT_MBEDTLS_2_0,/*!< The default Mbed TLS implementation */
7211fa71b9SJerome Forissier #if defined(MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED)
7311fa71b9SJerome Forissier     MBEDTLS_ECDH_VARIANT_EVEREST     /*!< Everest implementation */
7411fa71b9SJerome Forissier #endif
753d3b0591SJens Wiklander } mbedtls_ecdh_variant;
763d3b0591SJens Wiklander 
773d3b0591SJens Wiklander /**
783d3b0591SJens Wiklander  * The context used by the default ECDH implementation.
793d3b0591SJens Wiklander  *
803d3b0591SJens Wiklander  * Later versions might change the structure of this context, therefore users
813d3b0591SJens Wiklander  * should not make any assumptions about the structure of
823d3b0591SJens Wiklander  * mbedtls_ecdh_context_mbed.
833d3b0591SJens Wiklander  */
843d3b0591SJens Wiklander typedef struct mbedtls_ecdh_context_mbed
853d3b0591SJens Wiklander {
863d3b0591SJens Wiklander     mbedtls_ecp_group grp;   /*!< The elliptic curve used. */
873d3b0591SJens Wiklander     mbedtls_mpi d;           /*!< The private key. */
883d3b0591SJens Wiklander     mbedtls_ecp_point Q;     /*!< The public key. */
893d3b0591SJens Wiklander     mbedtls_ecp_point Qp;    /*!< The value of the public key of the peer. */
903d3b0591SJens Wiklander     mbedtls_mpi z;           /*!< The shared secret. */
913d3b0591SJens Wiklander #if defined(MBEDTLS_ECP_RESTARTABLE)
923d3b0591SJens Wiklander     mbedtls_ecp_restart_ctx rs; /*!< The restart context for EC computations. */
933d3b0591SJens Wiklander #endif
943d3b0591SJens Wiklander } mbedtls_ecdh_context_mbed;
953d3b0591SJens Wiklander #endif
963d3b0591SJens Wiklander 
973d3b0591SJens Wiklander /**
983d3b0591SJens Wiklander  *
993d3b0591SJens Wiklander  * \warning         Performing multiple operations concurrently on the same
1003d3b0591SJens Wiklander  *                  ECDSA context is not supported; objects of this type
1013d3b0591SJens Wiklander  *                  should not be shared between multiple threads.
1023d3b0591SJens Wiklander  * \brief           The ECDH context structure.
1033d3b0591SJens Wiklander  */
1043d3b0591SJens Wiklander typedef struct mbedtls_ecdh_context
1053d3b0591SJens Wiklander {
1063d3b0591SJens Wiklander #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT)
1073d3b0591SJens Wiklander     mbedtls_ecp_group grp;   /*!< The elliptic curve used. */
1083d3b0591SJens Wiklander     mbedtls_mpi d;           /*!< The private key. */
1093d3b0591SJens Wiklander     mbedtls_ecp_point Q;     /*!< The public key. */
1103d3b0591SJens Wiklander     mbedtls_ecp_point Qp;    /*!< The value of the public key of the peer. */
1113d3b0591SJens Wiklander     mbedtls_mpi z;           /*!< The shared secret. */
1123d3b0591SJens Wiklander     int point_format;        /*!< The format of point export in TLS messages. */
1133d3b0591SJens Wiklander     mbedtls_ecp_point Vi;    /*!< The blinding value. */
1143d3b0591SJens Wiklander     mbedtls_ecp_point Vf;    /*!< The unblinding value. */
1153d3b0591SJens Wiklander     mbedtls_mpi _d;          /*!< The previous \p d. */
1163d3b0591SJens Wiklander #if defined(MBEDTLS_ECP_RESTARTABLE)
1173d3b0591SJens Wiklander     int restart_enabled;        /*!< The flag for restartable mode. */
1183d3b0591SJens Wiklander     mbedtls_ecp_restart_ctx rs; /*!< The restart context for EC computations. */
1193d3b0591SJens Wiklander #endif /* MBEDTLS_ECP_RESTARTABLE */
1203d3b0591SJens Wiklander #else
1213d3b0591SJens Wiklander     uint8_t point_format;       /*!< The format of point export in TLS messages
1223d3b0591SJens Wiklander                                   as defined in RFC 4492. */
1233d3b0591SJens Wiklander     mbedtls_ecp_group_id grp_id;/*!< The elliptic curve used. */
1243d3b0591SJens Wiklander     mbedtls_ecdh_variant var;   /*!< The ECDH implementation/structure used. */
1253d3b0591SJens Wiklander     union
1263d3b0591SJens Wiklander     {
1273d3b0591SJens Wiklander         mbedtls_ecdh_context_mbed   mbed_ecdh;
12811fa71b9SJerome Forissier #if defined(MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED)
12911fa71b9SJerome Forissier         mbedtls_ecdh_context_everest everest_ecdh;
13011fa71b9SJerome Forissier #endif
1313d3b0591SJens Wiklander     } ctx;                      /*!< Implementation-specific context. The
1323d3b0591SJens Wiklander                                   context in use is specified by the \c var
1333d3b0591SJens Wiklander                                   field. */
1343d3b0591SJens Wiklander #if defined(MBEDTLS_ECP_RESTARTABLE)
1353d3b0591SJens Wiklander     uint8_t restart_enabled;    /*!< The flag for restartable mode. Functions of
1363d3b0591SJens Wiklander                                   an alternative implementation not supporting
1373d3b0591SJens Wiklander                                   restartable mode must return
1383d3b0591SJens Wiklander                                   MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED error
1393d3b0591SJens Wiklander                                   if this flag is set. */
1403d3b0591SJens Wiklander #endif /* MBEDTLS_ECP_RESTARTABLE */
1413d3b0591SJens Wiklander #endif /* MBEDTLS_ECDH_LEGACY_CONTEXT */
142817466cbSJens Wiklander }
143817466cbSJens Wiklander mbedtls_ecdh_context;
144817466cbSJens Wiklander 
145817466cbSJens Wiklander /**
14611fa71b9SJerome Forissier  * \brief          Check whether a given group can be used for ECDH.
14711fa71b9SJerome Forissier  *
14811fa71b9SJerome Forissier  * \param gid      The ECP group ID to check.
14911fa71b9SJerome Forissier  *
15011fa71b9SJerome Forissier  * \return         \c 1 if the group can be used, \c 0 otherwise
15111fa71b9SJerome Forissier  */
15211fa71b9SJerome Forissier int mbedtls_ecdh_can_do( mbedtls_ecp_group_id gid );
15311fa71b9SJerome Forissier 
15411fa71b9SJerome Forissier /**
1553d3b0591SJens Wiklander  * \brief           This function generates an ECDH keypair on an elliptic
1563d3b0591SJens Wiklander  *                  curve.
157817466cbSJens Wiklander  *
1583d3b0591SJens Wiklander  *                  This function performs the first of two core computations
1593d3b0591SJens Wiklander  *                  implemented during the ECDH key exchange. The second core
1603d3b0591SJens Wiklander  *                  computation is performed by mbedtls_ecdh_compute_shared().
161817466cbSJens Wiklander  *
1623d3b0591SJens Wiklander  * \see             ecp.h
1633d3b0591SJens Wiklander  *
1643d3b0591SJens Wiklander  * \param grp       The ECP group to use. This must be initialized and have
1653d3b0591SJens Wiklander  *                  domain parameters loaded, for example through
1663d3b0591SJens Wiklander  *                  mbedtls_ecp_load() or mbedtls_ecp_tls_read_group().
1673d3b0591SJens Wiklander  * \param d         The destination MPI (private key).
1683d3b0591SJens Wiklander  *                  This must be initialized.
1693d3b0591SJens Wiklander  * \param Q         The destination point (public key).
1703d3b0591SJens Wiklander  *                  This must be initialized.
1713d3b0591SJens Wiklander  * \param f_rng     The RNG function to use. This must not be \c NULL.
1723d3b0591SJens Wiklander  * \param p_rng     The RNG context to be passed to \p f_rng. This may be
1733d3b0591SJens Wiklander  *                  \c NULL in case \p f_rng doesn't need a context argument.
1743d3b0591SJens Wiklander  *
1753d3b0591SJens Wiklander  * \return          \c 0 on success.
1763d3b0591SJens Wiklander  * \return          Another \c MBEDTLS_ERR_ECP_XXX or
1773d3b0591SJens Wiklander  *                  \c MBEDTLS_MPI_XXX error code on failure.
178817466cbSJens Wiklander  */
179817466cbSJens Wiklander int mbedtls_ecdh_gen_public( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q,
180817466cbSJens Wiklander                      int (*f_rng)(void *, unsigned char *, size_t),
181817466cbSJens Wiklander                      void *p_rng );
182817466cbSJens Wiklander 
183817466cbSJens Wiklander /**
1843d3b0591SJens Wiklander  * \brief           This function computes the shared secret.
185817466cbSJens Wiklander  *
1863d3b0591SJens Wiklander  *                  This function performs the second of two core computations
1873d3b0591SJens Wiklander  *                  implemented during the ECDH key exchange. The first core
1883d3b0591SJens Wiklander  *                  computation is performed by mbedtls_ecdh_gen_public().
189817466cbSJens Wiklander  *
1903d3b0591SJens Wiklander  * \see             ecp.h
191817466cbSJens Wiklander  *
1923d3b0591SJens Wiklander  * \note            If \p f_rng is not NULL, it is used to implement
1933d3b0591SJens Wiklander  *                  countermeasures against side-channel attacks.
1943d3b0591SJens Wiklander  *                  For more information, see mbedtls_ecp_mul().
1953d3b0591SJens Wiklander  *
1963d3b0591SJens Wiklander  * \param grp       The ECP group to use. This must be initialized and have
1973d3b0591SJens Wiklander  *                  domain parameters loaded, for example through
1983d3b0591SJens Wiklander  *                  mbedtls_ecp_load() or mbedtls_ecp_tls_read_group().
1993d3b0591SJens Wiklander  * \param z         The destination MPI (shared secret).
2003d3b0591SJens Wiklander  *                  This must be initialized.
2013d3b0591SJens Wiklander  * \param Q         The public key from another party.
2023d3b0591SJens Wiklander  *                  This must be initialized.
2033d3b0591SJens Wiklander  * \param d         Our secret exponent (private key).
2043d3b0591SJens Wiklander  *                  This must be initialized.
2053d3b0591SJens Wiklander  * \param f_rng     The RNG function. This may be \c NULL if randomization
2063d3b0591SJens Wiklander  *                  of intermediate results during the ECP computations is
2073d3b0591SJens Wiklander  *                  not needed (discouraged). See the documentation of
2083d3b0591SJens Wiklander  *                  mbedtls_ecp_mul() for more.
2093d3b0591SJens Wiklander  * \param p_rng     The RNG context to be passed to \p f_rng. This may be
2103d3b0591SJens Wiklander  *                  \c NULL if \p f_rng is \c NULL or doesn't need a
2113d3b0591SJens Wiklander  *                  context argument.
2123d3b0591SJens Wiklander  *
2133d3b0591SJens Wiklander  * \return          \c 0 on success.
2143d3b0591SJens Wiklander  * \return          Another \c MBEDTLS_ERR_ECP_XXX or
2153d3b0591SJens Wiklander  *                  \c MBEDTLS_MPI_XXX error code on failure.
216817466cbSJens Wiklander  */
217817466cbSJens Wiklander int mbedtls_ecdh_compute_shared( mbedtls_ecp_group *grp, mbedtls_mpi *z,
218817466cbSJens Wiklander                          const mbedtls_ecp_point *Q, const mbedtls_mpi *d,
219817466cbSJens Wiklander                          int (*f_rng)(void *, unsigned char *, size_t),
220817466cbSJens Wiklander                          void *p_rng );
221817466cbSJens Wiklander 
222817466cbSJens Wiklander /**
2233d3b0591SJens Wiklander  * \brief           This function initializes an ECDH context.
224817466cbSJens Wiklander  *
2253d3b0591SJens Wiklander  * \param ctx       The ECDH context to initialize. This must not be \c NULL.
226817466cbSJens Wiklander  */
227817466cbSJens Wiklander void mbedtls_ecdh_init( mbedtls_ecdh_context *ctx );
228817466cbSJens Wiklander 
229817466cbSJens Wiklander /**
2303d3b0591SJens Wiklander  * \brief           This function sets up the ECDH context with the information
2313d3b0591SJens Wiklander  *                  given.
232817466cbSJens Wiklander  *
2333d3b0591SJens Wiklander  *                  This function should be called after mbedtls_ecdh_init() but
2343d3b0591SJens Wiklander  *                  before mbedtls_ecdh_make_params(). There is no need to call
2353d3b0591SJens Wiklander  *                  this function before mbedtls_ecdh_read_params().
2363d3b0591SJens Wiklander  *
2373d3b0591SJens Wiklander  *                  This is the first function used by a TLS server for ECDHE
2383d3b0591SJens Wiklander  *                  ciphersuites.
2393d3b0591SJens Wiklander  *
2403d3b0591SJens Wiklander  * \param ctx       The ECDH context to set up. This must be initialized.
2413d3b0591SJens Wiklander  * \param grp_id    The group id of the group to set up the context for.
2423d3b0591SJens Wiklander  *
2433d3b0591SJens Wiklander  * \return          \c 0 on success.
2443d3b0591SJens Wiklander  */
2453d3b0591SJens Wiklander int mbedtls_ecdh_setup( mbedtls_ecdh_context *ctx,
2463d3b0591SJens Wiklander                         mbedtls_ecp_group_id grp_id );
2473d3b0591SJens Wiklander 
2483d3b0591SJens Wiklander /**
2493d3b0591SJens Wiklander  * \brief           This function frees a context.
2503d3b0591SJens Wiklander  *
2513d3b0591SJens Wiklander  * \param ctx       The context to free. This may be \c NULL, in which
2523d3b0591SJens Wiklander  *                  case this function does nothing. If it is not \c NULL,
2533d3b0591SJens Wiklander  *                  it must point to an initialized ECDH context.
254817466cbSJens Wiklander  */
255817466cbSJens Wiklander void mbedtls_ecdh_free( mbedtls_ecdh_context *ctx );
256817466cbSJens Wiklander 
257817466cbSJens Wiklander /**
2583d3b0591SJens Wiklander  * \brief           This function generates an EC key pair and exports its
2593d3b0591SJens Wiklander  *                  in the format used in a TLS ServerKeyExchange handshake
2603d3b0591SJens Wiklander  *                  message.
261817466cbSJens Wiklander  *
2623d3b0591SJens Wiklander  *                  This is the second function used by a TLS server for ECDHE
2633d3b0591SJens Wiklander  *                  ciphersuites. (It is called after mbedtls_ecdh_setup().)
264817466cbSJens Wiklander  *
2653d3b0591SJens Wiklander  * \see             ecp.h
266817466cbSJens Wiklander  *
2673d3b0591SJens Wiklander  * \param ctx       The ECDH context to use. This must be initialized
2683d3b0591SJens Wiklander  *                  and bound to a group, for example via mbedtls_ecdh_setup().
2693d3b0591SJens Wiklander  * \param olen      The address at which to store the number of Bytes written.
2703d3b0591SJens Wiklander  * \param buf       The destination buffer. This must be a writable buffer of
2713d3b0591SJens Wiklander  *                  length \p blen Bytes.
2723d3b0591SJens Wiklander  * \param blen      The length of the destination buffer \p buf in Bytes.
2733d3b0591SJens Wiklander  * \param f_rng     The RNG function to use. This must not be \c NULL.
2743d3b0591SJens Wiklander  * \param p_rng     The RNG context to be passed to \p f_rng. This may be
2753d3b0591SJens Wiklander  *                  \c NULL in case \p f_rng doesn't need a context argument.
2763d3b0591SJens Wiklander  *
2773d3b0591SJens Wiklander  * \return          \c 0 on success.
2783d3b0591SJens Wiklander  * \return          #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of
2793d3b0591SJens Wiklander  *                  operations was reached: see \c mbedtls_ecp_set_max_ops().
2803d3b0591SJens Wiklander  * \return          Another \c MBEDTLS_ERR_ECP_XXX error code on failure.
281817466cbSJens Wiklander  */
282817466cbSJens Wiklander int mbedtls_ecdh_make_params( mbedtls_ecdh_context *ctx, size_t *olen,
283817466cbSJens Wiklander                       unsigned char *buf, size_t blen,
284817466cbSJens Wiklander                       int (*f_rng)(void *, unsigned char *, size_t),
285817466cbSJens Wiklander                       void *p_rng );
286817466cbSJens Wiklander 
287817466cbSJens Wiklander /**
2883d3b0591SJens Wiklander  * \brief           This function parses the ECDHE parameters in a
2893d3b0591SJens Wiklander  *                  TLS ServerKeyExchange handshake message.
290817466cbSJens Wiklander  *
2913d3b0591SJens Wiklander  * \note            In a TLS handshake, this is the how the client
2923d3b0591SJens Wiklander  *                  sets up its ECDHE context from the server's public
2933d3b0591SJens Wiklander  *                  ECDHE key material.
294817466cbSJens Wiklander  *
2953d3b0591SJens Wiklander  * \see             ecp.h
2963d3b0591SJens Wiklander  *
2973d3b0591SJens Wiklander  * \param ctx       The ECDHE context to use. This must be initialized.
2983d3b0591SJens Wiklander  * \param buf       On input, \c *buf must be the start of the input buffer.
2993d3b0591SJens Wiklander  *                  On output, \c *buf is updated to point to the end of the
3003d3b0591SJens Wiklander  *                  data that has been read. On success, this is the first byte
3013d3b0591SJens Wiklander  *                  past the end of the ServerKeyExchange parameters.
3023d3b0591SJens Wiklander  *                  On error, this is the point at which an error has been
3033d3b0591SJens Wiklander  *                  detected, which is usually not useful except to debug
3043d3b0591SJens Wiklander  *                  failures.
3053d3b0591SJens Wiklander  * \param end       The end of the input buffer.
3063d3b0591SJens Wiklander  *
3073d3b0591SJens Wiklander  * \return          \c 0 on success.
3083d3b0591SJens Wiklander  * \return          An \c MBEDTLS_ERR_ECP_XXX error code on failure.
3093d3b0591SJens Wiklander  *
310817466cbSJens Wiklander  */
311817466cbSJens Wiklander int mbedtls_ecdh_read_params( mbedtls_ecdh_context *ctx,
3123d3b0591SJens Wiklander                               const unsigned char **buf,
3133d3b0591SJens Wiklander                               const unsigned char *end );
314817466cbSJens Wiklander 
315817466cbSJens Wiklander /**
3163d3b0591SJens Wiklander  * \brief           This function sets up an ECDH context from an EC key.
317817466cbSJens Wiklander  *
3183d3b0591SJens Wiklander  *                  It is used by clients and servers in place of the
3193d3b0591SJens Wiklander  *                  ServerKeyEchange for static ECDH, and imports ECDH
3203d3b0591SJens Wiklander  *                  parameters from the EC key information of a certificate.
321817466cbSJens Wiklander  *
3223d3b0591SJens Wiklander  * \see             ecp.h
3233d3b0591SJens Wiklander  *
3243d3b0591SJens Wiklander  * \param ctx       The ECDH context to set up. This must be initialized.
3253d3b0591SJens Wiklander  * \param key       The EC key to use. This must be initialized.
3263d3b0591SJens Wiklander  * \param side      Defines the source of the key. Possible values are:
3273d3b0591SJens Wiklander  *                  - #MBEDTLS_ECDH_OURS: The key is ours.
3283d3b0591SJens Wiklander  *                  - #MBEDTLS_ECDH_THEIRS: The key is that of the peer.
3293d3b0591SJens Wiklander  *
3303d3b0591SJens Wiklander  * \return          \c 0 on success.
3313d3b0591SJens Wiklander  * \return          Another \c MBEDTLS_ERR_ECP_XXX error code on failure.
3323d3b0591SJens Wiklander  *
333817466cbSJens Wiklander  */
3343d3b0591SJens Wiklander int mbedtls_ecdh_get_params( mbedtls_ecdh_context *ctx,
3353d3b0591SJens Wiklander                              const mbedtls_ecp_keypair *key,
336817466cbSJens Wiklander                              mbedtls_ecdh_side side );
337817466cbSJens Wiklander 
338817466cbSJens Wiklander /**
3393d3b0591SJens Wiklander  * \brief           This function generates a public key and exports it
3403d3b0591SJens Wiklander  *                  as a TLS ClientKeyExchange payload.
341817466cbSJens Wiklander  *
3423d3b0591SJens Wiklander  *                  This is the second function used by a TLS client for ECDH(E)
3433d3b0591SJens Wiklander  *                  ciphersuites.
344817466cbSJens Wiklander  *
3453d3b0591SJens Wiklander  * \see             ecp.h
3463d3b0591SJens Wiklander  *
3473d3b0591SJens Wiklander  * \param ctx       The ECDH context to use. This must be initialized
3483d3b0591SJens Wiklander  *                  and bound to a group, the latter usually by
3493d3b0591SJens Wiklander  *                  mbedtls_ecdh_read_params().
3503d3b0591SJens Wiklander  * \param olen      The address at which to store the number of Bytes written.
3513d3b0591SJens Wiklander  *                  This must not be \c NULL.
3523d3b0591SJens Wiklander  * \param buf       The destination buffer. This must be a writable buffer
3533d3b0591SJens Wiklander  *                  of length \p blen Bytes.
3543d3b0591SJens Wiklander  * \param blen      The size of the destination buffer \p buf in Bytes.
3553d3b0591SJens Wiklander  * \param f_rng     The RNG function to use. This must not be \c NULL.
3563d3b0591SJens Wiklander  * \param p_rng     The RNG context to be passed to \p f_rng. This may be
3573d3b0591SJens Wiklander  *                  \c NULL in case \p f_rng doesn't need a context argument.
3583d3b0591SJens Wiklander  *
3593d3b0591SJens Wiklander  * \return          \c 0 on success.
3603d3b0591SJens Wiklander  * \return          #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of
3613d3b0591SJens Wiklander  *                  operations was reached: see \c mbedtls_ecp_set_max_ops().
3623d3b0591SJens Wiklander  * \return          Another \c MBEDTLS_ERR_ECP_XXX error code on failure.
363817466cbSJens Wiklander  */
364817466cbSJens Wiklander int mbedtls_ecdh_make_public( mbedtls_ecdh_context *ctx, size_t *olen,
365817466cbSJens Wiklander                       unsigned char *buf, size_t blen,
366817466cbSJens Wiklander                       int (*f_rng)(void *, unsigned char *, size_t),
367817466cbSJens Wiklander                       void *p_rng );
368817466cbSJens Wiklander 
369817466cbSJens Wiklander /**
3703d3b0591SJens Wiklander  * \brief       This function parses and processes the ECDHE payload of a
3713d3b0591SJens Wiklander  *              TLS ClientKeyExchange message.
372817466cbSJens Wiklander  *
3733d3b0591SJens Wiklander  *              This is the third function used by a TLS server for ECDH(E)
3743d3b0591SJens Wiklander  *              ciphersuites. (It is called after mbedtls_ecdh_setup() and
3753d3b0591SJens Wiklander  *              mbedtls_ecdh_make_params().)
376817466cbSJens Wiklander  *
3773d3b0591SJens Wiklander  * \see         ecp.h
3783d3b0591SJens Wiklander  *
3793d3b0591SJens Wiklander  * \param ctx   The ECDH context to use. This must be initialized
3803d3b0591SJens Wiklander  *              and bound to a group, for example via mbedtls_ecdh_setup().
3813d3b0591SJens Wiklander  * \param buf   The pointer to the ClientKeyExchange payload. This must
3823d3b0591SJens Wiklander  *              be a readable buffer of length \p blen Bytes.
3833d3b0591SJens Wiklander  * \param blen  The length of the input buffer \p buf in Bytes.
3843d3b0591SJens Wiklander  *
3853d3b0591SJens Wiklander  * \return      \c 0 on success.
3863d3b0591SJens Wiklander  * \return      An \c MBEDTLS_ERR_ECP_XXX error code on failure.
387817466cbSJens Wiklander  */
388817466cbSJens Wiklander int mbedtls_ecdh_read_public( mbedtls_ecdh_context *ctx,
389817466cbSJens Wiklander                               const unsigned char *buf, size_t blen );
390817466cbSJens Wiklander 
391817466cbSJens Wiklander /**
3923d3b0591SJens Wiklander  * \brief           This function derives and exports the shared secret.
393817466cbSJens Wiklander  *
3943d3b0591SJens Wiklander  *                  This is the last function used by both TLS client
3953d3b0591SJens Wiklander  *                  and servers.
396817466cbSJens Wiklander  *
3973d3b0591SJens Wiklander  * \note            If \p f_rng is not NULL, it is used to implement
3983d3b0591SJens Wiklander  *                  countermeasures against side-channel attacks.
3993d3b0591SJens Wiklander  *                  For more information, see mbedtls_ecp_mul().
4003d3b0591SJens Wiklander  *
4013d3b0591SJens Wiklander  * \see             ecp.h
4023d3b0591SJens Wiklander 
4033d3b0591SJens Wiklander  * \param ctx       The ECDH context to use. This must be initialized
4043d3b0591SJens Wiklander  *                  and have its own private key generated and the peer's
4053d3b0591SJens Wiklander  *                  public key imported.
4063d3b0591SJens Wiklander  * \param olen      The address at which to store the total number of
4073d3b0591SJens Wiklander  *                  Bytes written on success. This must not be \c NULL.
4083d3b0591SJens Wiklander  * \param buf       The buffer to write the generated shared key to. This
4093d3b0591SJens Wiklander  *                  must be a writable buffer of size \p blen Bytes.
4103d3b0591SJens Wiklander  * \param blen      The length of the destination buffer \p buf in Bytes.
4113d3b0591SJens Wiklander  * \param f_rng     The RNG function, for blinding purposes. This may
4123d3b0591SJens Wiklander  *                  b \c NULL if blinding isn't needed.
4133d3b0591SJens Wiklander  * \param p_rng     The RNG context. This may be \c NULL if \p f_rng
4143d3b0591SJens Wiklander  *                  doesn't need a context argument.
4153d3b0591SJens Wiklander  *
4163d3b0591SJens Wiklander  * \return          \c 0 on success.
4173d3b0591SJens Wiklander  * \return          #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of
4183d3b0591SJens Wiklander  *                  operations was reached: see \c mbedtls_ecp_set_max_ops().
4193d3b0591SJens Wiklander  * \return          Another \c MBEDTLS_ERR_ECP_XXX error code on failure.
420817466cbSJens Wiklander  */
421817466cbSJens Wiklander int mbedtls_ecdh_calc_secret( mbedtls_ecdh_context *ctx, size_t *olen,
422817466cbSJens Wiklander                       unsigned char *buf, size_t blen,
423817466cbSJens Wiklander                       int (*f_rng)(void *, unsigned char *, size_t),
424817466cbSJens Wiklander                       void *p_rng );
425817466cbSJens Wiklander 
4263d3b0591SJens Wiklander #if defined(MBEDTLS_ECP_RESTARTABLE)
4273d3b0591SJens Wiklander /**
4283d3b0591SJens Wiklander  * \brief           This function enables restartable EC computations for this
4293d3b0591SJens Wiklander  *                  context.  (Default: disabled.)
4303d3b0591SJens Wiklander  *
4313d3b0591SJens Wiklander  * \see             \c mbedtls_ecp_set_max_ops()
4323d3b0591SJens Wiklander  *
4333d3b0591SJens Wiklander  * \note            It is not possible to safely disable restartable
4343d3b0591SJens Wiklander  *                  computations once enabled, except by free-ing the context,
4353d3b0591SJens Wiklander  *                  which cancels possible in-progress operations.
4363d3b0591SJens Wiklander  *
4373d3b0591SJens Wiklander  * \param ctx       The ECDH context to use. This must be initialized.
4383d3b0591SJens Wiklander  */
4393d3b0591SJens Wiklander void mbedtls_ecdh_enable_restart( mbedtls_ecdh_context *ctx );
4403d3b0591SJens Wiklander #endif /* MBEDTLS_ECP_RESTARTABLE */
4413d3b0591SJens Wiklander 
442817466cbSJens Wiklander #ifdef __cplusplus
443817466cbSJens Wiklander }
444817466cbSJens Wiklander #endif
445817466cbSJens Wiklander 
446817466cbSJens Wiklander #endif /* ecdh.h */
447