xref: /optee_os/lib/libmbedtls/mbedtls/include/mbedtls/ecdh.h (revision 11fa71b9ddb429088f325cfda430183003ccd1db)
1c6672fdcSEdison Ai /* SPDX-License-Identifier: Apache-2.0 */
2817466cbSJens Wiklander /**
3817466cbSJens Wiklander  * \file ecdh.h
4817466cbSJens Wiklander  *
53d3b0591SJens Wiklander  * \brief This file contains ECDH definitions and functions.
6817466cbSJens Wiklander  *
73d3b0591SJens Wiklander  * The Elliptic Curve Diffie-Hellman (ECDH) protocol is an anonymous
83d3b0591SJens Wiklander  * key agreement protocol allowing two parties to establish a shared
93d3b0591SJens Wiklander  * secret over an insecure channel. Each party must have an
103d3b0591SJens Wiklander  * elliptic-curve public–private key pair.
113d3b0591SJens Wiklander  *
123d3b0591SJens Wiklander  * For more information, see <em>NIST SP 800-56A Rev. 2: Recommendation for
133d3b0591SJens Wiklander  * Pair-Wise Key Establishment Schemes Using Discrete Logarithm
143d3b0591SJens Wiklander  * Cryptography</em>.
153d3b0591SJens Wiklander  */
163d3b0591SJens Wiklander /*
173d3b0591SJens Wiklander  *  Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved
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  *  This file is part of Mbed TLS (https://tls.mbed.org)
32817466cbSJens Wiklander  */
333d3b0591SJens Wiklander 
34817466cbSJens Wiklander #ifndef MBEDTLS_ECDH_H
35817466cbSJens Wiklander #define MBEDTLS_ECDH_H
36817466cbSJens Wiklander 
375b25c76aSJerome Forissier #if !defined(MBEDTLS_CONFIG_FILE)
38*11fa71b9SJerome Forissier #include "mbedtls/config.h"
395b25c76aSJerome Forissier #else
405b25c76aSJerome Forissier #include MBEDTLS_CONFIG_FILE
415b25c76aSJerome Forissier #endif
425b25c76aSJerome Forissier 
43*11fa71b9SJerome Forissier #include "mbedtls/ecp.h"
44817466cbSJens Wiklander 
45*11fa71b9SJerome Forissier #if defined(MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED)
46*11fa71b9SJerome Forissier #undef MBEDTLS_ECDH_LEGACY_CONTEXT
47*11fa71b9SJerome Forissier #include "everest/everest.h"
48*11fa71b9SJerome Forissier #endif
493d3b0591SJens Wiklander 
50817466cbSJens Wiklander #ifdef __cplusplus
51817466cbSJens Wiklander extern "C" {
52817466cbSJens Wiklander #endif
53817466cbSJens Wiklander 
54817466cbSJens Wiklander /**
553d3b0591SJens Wiklander  * Defines the source of the imported EC key.
56817466cbSJens Wiklander  */
57817466cbSJens Wiklander typedef enum
58817466cbSJens Wiklander {
593d3b0591SJens Wiklander     MBEDTLS_ECDH_OURS,   /**< Our key. */
603d3b0591SJens Wiklander     MBEDTLS_ECDH_THEIRS, /**< The key of the peer. */
61817466cbSJens Wiklander } mbedtls_ecdh_side;
62817466cbSJens Wiklander 
633d3b0591SJens Wiklander #if !defined(MBEDTLS_ECDH_LEGACY_CONTEXT)
64817466cbSJens Wiklander /**
653d3b0591SJens Wiklander  * Defines the ECDH implementation used.
663d3b0591SJens Wiklander  *
673d3b0591SJens Wiklander  * Later versions of the library may add new variants, therefore users should
683d3b0591SJens Wiklander  * not make any assumptions about them.
69817466cbSJens Wiklander  */
703d3b0591SJens Wiklander typedef enum
71817466cbSJens Wiklander {
723d3b0591SJens Wiklander     MBEDTLS_ECDH_VARIANT_NONE = 0,   /*!< Implementation not defined. */
733d3b0591SJens Wiklander     MBEDTLS_ECDH_VARIANT_MBEDTLS_2_0,/*!< The default Mbed TLS implementation */
74*11fa71b9SJerome Forissier #if defined(MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED)
75*11fa71b9SJerome Forissier     MBEDTLS_ECDH_VARIANT_EVEREST     /*!< Everest implementation */
76*11fa71b9SJerome Forissier #endif
773d3b0591SJens Wiklander } mbedtls_ecdh_variant;
783d3b0591SJens Wiklander 
793d3b0591SJens Wiklander /**
803d3b0591SJens Wiklander  * The context used by the default ECDH implementation.
813d3b0591SJens Wiklander  *
823d3b0591SJens Wiklander  * Later versions might change the structure of this context, therefore users
833d3b0591SJens Wiklander  * should not make any assumptions about the structure of
843d3b0591SJens Wiklander  * mbedtls_ecdh_context_mbed.
853d3b0591SJens Wiklander  */
863d3b0591SJens Wiklander typedef struct mbedtls_ecdh_context_mbed
873d3b0591SJens Wiklander {
883d3b0591SJens Wiklander     mbedtls_ecp_group grp;   /*!< The elliptic curve used. */
893d3b0591SJens Wiklander     mbedtls_mpi d;           /*!< The private key. */
903d3b0591SJens Wiklander     mbedtls_ecp_point Q;     /*!< The public key. */
913d3b0591SJens Wiklander     mbedtls_ecp_point Qp;    /*!< The value of the public key of the peer. */
923d3b0591SJens Wiklander     mbedtls_mpi z;           /*!< The shared secret. */
933d3b0591SJens Wiklander #if defined(MBEDTLS_ECP_RESTARTABLE)
943d3b0591SJens Wiklander     mbedtls_ecp_restart_ctx rs; /*!< The restart context for EC computations. */
953d3b0591SJens Wiklander #endif
963d3b0591SJens Wiklander } mbedtls_ecdh_context_mbed;
973d3b0591SJens Wiklander #endif
983d3b0591SJens Wiklander 
993d3b0591SJens Wiklander /**
1003d3b0591SJens Wiklander  *
1013d3b0591SJens Wiklander  * \warning         Performing multiple operations concurrently on the same
1023d3b0591SJens Wiklander  *                  ECDSA context is not supported; objects of this type
1033d3b0591SJens Wiklander  *                  should not be shared between multiple threads.
1043d3b0591SJens Wiklander  * \brief           The ECDH context structure.
1053d3b0591SJens Wiklander  */
1063d3b0591SJens Wiklander typedef struct mbedtls_ecdh_context
1073d3b0591SJens Wiklander {
1083d3b0591SJens Wiklander #if defined(MBEDTLS_ECDH_LEGACY_CONTEXT)
1093d3b0591SJens Wiklander     mbedtls_ecp_group grp;   /*!< The elliptic curve used. */
1103d3b0591SJens Wiklander     mbedtls_mpi d;           /*!< The private key. */
1113d3b0591SJens Wiklander     mbedtls_ecp_point Q;     /*!< The public key. */
1123d3b0591SJens Wiklander     mbedtls_ecp_point Qp;    /*!< The value of the public key of the peer. */
1133d3b0591SJens Wiklander     mbedtls_mpi z;           /*!< The shared secret. */
1143d3b0591SJens Wiklander     int point_format;        /*!< The format of point export in TLS messages. */
1153d3b0591SJens Wiklander     mbedtls_ecp_point Vi;    /*!< The blinding value. */
1163d3b0591SJens Wiklander     mbedtls_ecp_point Vf;    /*!< The unblinding value. */
1173d3b0591SJens Wiklander     mbedtls_mpi _d;          /*!< The previous \p d. */
1183d3b0591SJens Wiklander #if defined(MBEDTLS_ECP_RESTARTABLE)
1193d3b0591SJens Wiklander     int restart_enabled;        /*!< The flag for restartable mode. */
1203d3b0591SJens Wiklander     mbedtls_ecp_restart_ctx rs; /*!< The restart context for EC computations. */
1213d3b0591SJens Wiklander #endif /* MBEDTLS_ECP_RESTARTABLE */
1223d3b0591SJens Wiklander #else
1233d3b0591SJens Wiklander     uint8_t point_format;       /*!< The format of point export in TLS messages
1243d3b0591SJens Wiklander                                   as defined in RFC 4492. */
1253d3b0591SJens Wiklander     mbedtls_ecp_group_id grp_id;/*!< The elliptic curve used. */
1263d3b0591SJens Wiklander     mbedtls_ecdh_variant var;   /*!< The ECDH implementation/structure used. */
1273d3b0591SJens Wiklander     union
1283d3b0591SJens Wiklander     {
1293d3b0591SJens Wiklander         mbedtls_ecdh_context_mbed   mbed_ecdh;
130*11fa71b9SJerome Forissier #if defined(MBEDTLS_ECDH_VARIANT_EVEREST_ENABLED)
131*11fa71b9SJerome Forissier         mbedtls_ecdh_context_everest everest_ecdh;
132*11fa71b9SJerome Forissier #endif
1333d3b0591SJens Wiklander     } ctx;                      /*!< Implementation-specific context. The
1343d3b0591SJens Wiklander                                   context in use is specified by the \c var
1353d3b0591SJens Wiklander                                   field. */
1363d3b0591SJens Wiklander #if defined(MBEDTLS_ECP_RESTARTABLE)
1373d3b0591SJens Wiklander     uint8_t restart_enabled;    /*!< The flag for restartable mode. Functions of
1383d3b0591SJens Wiklander                                   an alternative implementation not supporting
1393d3b0591SJens Wiklander                                   restartable mode must return
1403d3b0591SJens Wiklander                                   MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED error
1413d3b0591SJens Wiklander                                   if this flag is set. */
1423d3b0591SJens Wiklander #endif /* MBEDTLS_ECP_RESTARTABLE */
1433d3b0591SJens Wiklander #endif /* MBEDTLS_ECDH_LEGACY_CONTEXT */
144817466cbSJens Wiklander }
145817466cbSJens Wiklander mbedtls_ecdh_context;
146817466cbSJens Wiklander 
147817466cbSJens Wiklander /**
148*11fa71b9SJerome Forissier  * \brief          Check whether a given group can be used for ECDH.
149*11fa71b9SJerome Forissier  *
150*11fa71b9SJerome Forissier  * \param gid      The ECP group ID to check.
151*11fa71b9SJerome Forissier  *
152*11fa71b9SJerome Forissier  * \return         \c 1 if the group can be used, \c 0 otherwise
153*11fa71b9SJerome Forissier  */
154*11fa71b9SJerome Forissier int mbedtls_ecdh_can_do( mbedtls_ecp_group_id gid );
155*11fa71b9SJerome Forissier 
156*11fa71b9SJerome Forissier /**
1573d3b0591SJens Wiklander  * \brief           This function generates an ECDH keypair on an elliptic
1583d3b0591SJens Wiklander  *                  curve.
159817466cbSJens Wiklander  *
1603d3b0591SJens Wiklander  *                  This function performs the first of two core computations
1613d3b0591SJens Wiklander  *                  implemented during the ECDH key exchange. The second core
1623d3b0591SJens Wiklander  *                  computation is performed by mbedtls_ecdh_compute_shared().
163817466cbSJens Wiklander  *
1643d3b0591SJens Wiklander  * \see             ecp.h
1653d3b0591SJens Wiklander  *
1663d3b0591SJens Wiklander  * \param grp       The ECP group to use. This must be initialized and have
1673d3b0591SJens Wiklander  *                  domain parameters loaded, for example through
1683d3b0591SJens Wiklander  *                  mbedtls_ecp_load() or mbedtls_ecp_tls_read_group().
1693d3b0591SJens Wiklander  * \param d         The destination MPI (private key).
1703d3b0591SJens Wiklander  *                  This must be initialized.
1713d3b0591SJens Wiklander  * \param Q         The destination point (public key).
1723d3b0591SJens Wiklander  *                  This must be initialized.
1733d3b0591SJens Wiklander  * \param f_rng     The RNG function to use. This must not be \c NULL.
1743d3b0591SJens Wiklander  * \param p_rng     The RNG context to be passed to \p f_rng. This may be
1753d3b0591SJens Wiklander  *                  \c NULL in case \p f_rng doesn't need a context argument.
1763d3b0591SJens Wiklander  *
1773d3b0591SJens Wiklander  * \return          \c 0 on success.
1783d3b0591SJens Wiklander  * \return          Another \c MBEDTLS_ERR_ECP_XXX or
1793d3b0591SJens Wiklander  *                  \c MBEDTLS_MPI_XXX error code on failure.
180817466cbSJens Wiklander  */
181817466cbSJens Wiklander int mbedtls_ecdh_gen_public( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q,
182817466cbSJens Wiklander                      int (*f_rng)(void *, unsigned char *, size_t),
183817466cbSJens Wiklander                      void *p_rng );
184817466cbSJens Wiklander 
185817466cbSJens Wiklander /**
1863d3b0591SJens Wiklander  * \brief           This function computes the shared secret.
187817466cbSJens Wiklander  *
1883d3b0591SJens Wiklander  *                  This function performs the second of two core computations
1893d3b0591SJens Wiklander  *                  implemented during the ECDH key exchange. The first core
1903d3b0591SJens Wiklander  *                  computation is performed by mbedtls_ecdh_gen_public().
191817466cbSJens Wiklander  *
1923d3b0591SJens Wiklander  * \see             ecp.h
193817466cbSJens Wiklander  *
1943d3b0591SJens Wiklander  * \note            If \p f_rng is not NULL, it is used to implement
1953d3b0591SJens Wiklander  *                  countermeasures against side-channel attacks.
1963d3b0591SJens Wiklander  *                  For more information, see mbedtls_ecp_mul().
1973d3b0591SJens Wiklander  *
1983d3b0591SJens Wiklander  * \param grp       The ECP group to use. This must be initialized and have
1993d3b0591SJens Wiklander  *                  domain parameters loaded, for example through
2003d3b0591SJens Wiklander  *                  mbedtls_ecp_load() or mbedtls_ecp_tls_read_group().
2013d3b0591SJens Wiklander  * \param z         The destination MPI (shared secret).
2023d3b0591SJens Wiklander  *                  This must be initialized.
2033d3b0591SJens Wiklander  * \param Q         The public key from another party.
2043d3b0591SJens Wiklander  *                  This must be initialized.
2053d3b0591SJens Wiklander  * \param d         Our secret exponent (private key).
2063d3b0591SJens Wiklander  *                  This must be initialized.
2073d3b0591SJens Wiklander  * \param f_rng     The RNG function. This may be \c NULL if randomization
2083d3b0591SJens Wiklander  *                  of intermediate results during the ECP computations is
2093d3b0591SJens Wiklander  *                  not needed (discouraged). See the documentation of
2103d3b0591SJens Wiklander  *                  mbedtls_ecp_mul() for more.
2113d3b0591SJens Wiklander  * \param p_rng     The RNG context to be passed to \p f_rng. This may be
2123d3b0591SJens Wiklander  *                  \c NULL if \p f_rng is \c NULL or doesn't need a
2133d3b0591SJens Wiklander  *                  context argument.
2143d3b0591SJens Wiklander  *
2153d3b0591SJens Wiklander  * \return          \c 0 on success.
2163d3b0591SJens Wiklander  * \return          Another \c MBEDTLS_ERR_ECP_XXX or
2173d3b0591SJens Wiklander  *                  \c MBEDTLS_MPI_XXX error code on failure.
218817466cbSJens Wiklander  */
219817466cbSJens Wiklander int mbedtls_ecdh_compute_shared( mbedtls_ecp_group *grp, mbedtls_mpi *z,
220817466cbSJens Wiklander                          const mbedtls_ecp_point *Q, const mbedtls_mpi *d,
221817466cbSJens Wiklander                          int (*f_rng)(void *, unsigned char *, size_t),
222817466cbSJens Wiklander                          void *p_rng );
223817466cbSJens Wiklander 
224817466cbSJens Wiklander /**
2253d3b0591SJens Wiklander  * \brief           This function initializes an ECDH context.
226817466cbSJens Wiklander  *
2273d3b0591SJens Wiklander  * \param ctx       The ECDH context to initialize. This must not be \c NULL.
228817466cbSJens Wiklander  */
229817466cbSJens Wiklander void mbedtls_ecdh_init( mbedtls_ecdh_context *ctx );
230817466cbSJens Wiklander 
231817466cbSJens Wiklander /**
2323d3b0591SJens Wiklander  * \brief           This function sets up the ECDH context with the information
2333d3b0591SJens Wiklander  *                  given.
234817466cbSJens Wiklander  *
2353d3b0591SJens Wiklander  *                  This function should be called after mbedtls_ecdh_init() but
2363d3b0591SJens Wiklander  *                  before mbedtls_ecdh_make_params(). There is no need to call
2373d3b0591SJens Wiklander  *                  this function before mbedtls_ecdh_read_params().
2383d3b0591SJens Wiklander  *
2393d3b0591SJens Wiklander  *                  This is the first function used by a TLS server for ECDHE
2403d3b0591SJens Wiklander  *                  ciphersuites.
2413d3b0591SJens Wiklander  *
2423d3b0591SJens Wiklander  * \param ctx       The ECDH context to set up. This must be initialized.
2433d3b0591SJens Wiklander  * \param grp_id    The group id of the group to set up the context for.
2443d3b0591SJens Wiklander  *
2453d3b0591SJens Wiklander  * \return          \c 0 on success.
2463d3b0591SJens Wiklander  */
2473d3b0591SJens Wiklander int mbedtls_ecdh_setup( mbedtls_ecdh_context *ctx,
2483d3b0591SJens Wiklander                         mbedtls_ecp_group_id grp_id );
2493d3b0591SJens Wiklander 
2503d3b0591SJens Wiklander /**
2513d3b0591SJens Wiklander  * \brief           This function frees a context.
2523d3b0591SJens Wiklander  *
2533d3b0591SJens Wiklander  * \param ctx       The context to free. This may be \c NULL, in which
2543d3b0591SJens Wiklander  *                  case this function does nothing. If it is not \c NULL,
2553d3b0591SJens Wiklander  *                  it must point to an initialized ECDH context.
256817466cbSJens Wiklander  */
257817466cbSJens Wiklander void mbedtls_ecdh_free( mbedtls_ecdh_context *ctx );
258817466cbSJens Wiklander 
259817466cbSJens Wiklander /**
2603d3b0591SJens Wiklander  * \brief           This function generates an EC key pair and exports its
2613d3b0591SJens Wiklander  *                  in the format used in a TLS ServerKeyExchange handshake
2623d3b0591SJens Wiklander  *                  message.
263817466cbSJens Wiklander  *
2643d3b0591SJens Wiklander  *                  This is the second function used by a TLS server for ECDHE
2653d3b0591SJens Wiklander  *                  ciphersuites. (It is called after mbedtls_ecdh_setup().)
266817466cbSJens Wiklander  *
2673d3b0591SJens Wiklander  * \see             ecp.h
268817466cbSJens Wiklander  *
2693d3b0591SJens Wiklander  * \param ctx       The ECDH context to use. This must be initialized
2703d3b0591SJens Wiklander  *                  and bound to a group, for example via mbedtls_ecdh_setup().
2713d3b0591SJens Wiklander  * \param olen      The address at which to store the number of Bytes written.
2723d3b0591SJens Wiklander  * \param buf       The destination buffer. This must be a writable buffer of
2733d3b0591SJens Wiklander  *                  length \p blen Bytes.
2743d3b0591SJens Wiklander  * \param blen      The length of the destination buffer \p buf in Bytes.
2753d3b0591SJens Wiklander  * \param f_rng     The RNG function to use. This must not be \c NULL.
2763d3b0591SJens Wiklander  * \param p_rng     The RNG context to be passed to \p f_rng. This may be
2773d3b0591SJens Wiklander  *                  \c NULL in case \p f_rng doesn't need a context argument.
2783d3b0591SJens Wiklander  *
2793d3b0591SJens Wiklander  * \return          \c 0 on success.
2803d3b0591SJens Wiklander  * \return          #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of
2813d3b0591SJens Wiklander  *                  operations was reached: see \c mbedtls_ecp_set_max_ops().
2823d3b0591SJens Wiklander  * \return          Another \c MBEDTLS_ERR_ECP_XXX error code on failure.
283817466cbSJens Wiklander  */
284817466cbSJens Wiklander int mbedtls_ecdh_make_params( mbedtls_ecdh_context *ctx, size_t *olen,
285817466cbSJens Wiklander                       unsigned char *buf, size_t blen,
286817466cbSJens Wiklander                       int (*f_rng)(void *, unsigned char *, size_t),
287817466cbSJens Wiklander                       void *p_rng );
288817466cbSJens Wiklander 
289817466cbSJens Wiklander /**
2903d3b0591SJens Wiklander  * \brief           This function parses the ECDHE parameters in a
2913d3b0591SJens Wiklander  *                  TLS ServerKeyExchange handshake message.
292817466cbSJens Wiklander  *
2933d3b0591SJens Wiklander  * \note            In a TLS handshake, this is the how the client
2943d3b0591SJens Wiklander  *                  sets up its ECDHE context from the server's public
2953d3b0591SJens Wiklander  *                  ECDHE key material.
296817466cbSJens Wiklander  *
2973d3b0591SJens Wiklander  * \see             ecp.h
2983d3b0591SJens Wiklander  *
2993d3b0591SJens Wiklander  * \param ctx       The ECDHE context to use. This must be initialized.
3003d3b0591SJens Wiklander  * \param buf       On input, \c *buf must be the start of the input buffer.
3013d3b0591SJens Wiklander  *                  On output, \c *buf is updated to point to the end of the
3023d3b0591SJens Wiklander  *                  data that has been read. On success, this is the first byte
3033d3b0591SJens Wiklander  *                  past the end of the ServerKeyExchange parameters.
3043d3b0591SJens Wiklander  *                  On error, this is the point at which an error has been
3053d3b0591SJens Wiklander  *                  detected, which is usually not useful except to debug
3063d3b0591SJens Wiklander  *                  failures.
3073d3b0591SJens Wiklander  * \param end       The end of the input buffer.
3083d3b0591SJens Wiklander  *
3093d3b0591SJens Wiklander  * \return          \c 0 on success.
3103d3b0591SJens Wiklander  * \return          An \c MBEDTLS_ERR_ECP_XXX error code on failure.
3113d3b0591SJens Wiklander  *
312817466cbSJens Wiklander  */
313817466cbSJens Wiklander int mbedtls_ecdh_read_params( mbedtls_ecdh_context *ctx,
3143d3b0591SJens Wiklander                               const unsigned char **buf,
3153d3b0591SJens Wiklander                               const unsigned char *end );
316817466cbSJens Wiklander 
317817466cbSJens Wiklander /**
3183d3b0591SJens Wiklander  * \brief           This function sets up an ECDH context from an EC key.
319817466cbSJens Wiklander  *
3203d3b0591SJens Wiklander  *                  It is used by clients and servers in place of the
3213d3b0591SJens Wiklander  *                  ServerKeyEchange for static ECDH, and imports ECDH
3223d3b0591SJens Wiklander  *                  parameters from the EC key information of a certificate.
323817466cbSJens Wiklander  *
3243d3b0591SJens Wiklander  * \see             ecp.h
3253d3b0591SJens Wiklander  *
3263d3b0591SJens Wiklander  * \param ctx       The ECDH context to set up. This must be initialized.
3273d3b0591SJens Wiklander  * \param key       The EC key to use. This must be initialized.
3283d3b0591SJens Wiklander  * \param side      Defines the source of the key. Possible values are:
3293d3b0591SJens Wiklander  *                  - #MBEDTLS_ECDH_OURS: The key is ours.
3303d3b0591SJens Wiklander  *                  - #MBEDTLS_ECDH_THEIRS: The key is that of the peer.
3313d3b0591SJens Wiklander  *
3323d3b0591SJens Wiklander  * \return          \c 0 on success.
3333d3b0591SJens Wiklander  * \return          Another \c MBEDTLS_ERR_ECP_XXX error code on failure.
3343d3b0591SJens Wiklander  *
335817466cbSJens Wiklander  */
3363d3b0591SJens Wiklander int mbedtls_ecdh_get_params( mbedtls_ecdh_context *ctx,
3373d3b0591SJens Wiklander                              const mbedtls_ecp_keypair *key,
338817466cbSJens Wiklander                              mbedtls_ecdh_side side );
339817466cbSJens Wiklander 
340817466cbSJens Wiklander /**
3413d3b0591SJens Wiklander  * \brief           This function generates a public key and exports it
3423d3b0591SJens Wiklander  *                  as a TLS ClientKeyExchange payload.
343817466cbSJens Wiklander  *
3443d3b0591SJens Wiklander  *                  This is the second function used by a TLS client for ECDH(E)
3453d3b0591SJens Wiklander  *                  ciphersuites.
346817466cbSJens Wiklander  *
3473d3b0591SJens Wiklander  * \see             ecp.h
3483d3b0591SJens Wiklander  *
3493d3b0591SJens Wiklander  * \param ctx       The ECDH context to use. This must be initialized
3503d3b0591SJens Wiklander  *                  and bound to a group, the latter usually by
3513d3b0591SJens Wiklander  *                  mbedtls_ecdh_read_params().
3523d3b0591SJens Wiklander  * \param olen      The address at which to store the number of Bytes written.
3533d3b0591SJens Wiklander  *                  This must not be \c NULL.
3543d3b0591SJens Wiklander  * \param buf       The destination buffer. This must be a writable buffer
3553d3b0591SJens Wiklander  *                  of length \p blen Bytes.
3563d3b0591SJens Wiklander  * \param blen      The size of the destination buffer \p buf in Bytes.
3573d3b0591SJens Wiklander  * \param f_rng     The RNG function to use. This must not be \c NULL.
3583d3b0591SJens Wiklander  * \param p_rng     The RNG context to be passed to \p f_rng. This may be
3593d3b0591SJens Wiklander  *                  \c NULL in case \p f_rng doesn't need a context argument.
3603d3b0591SJens Wiklander  *
3613d3b0591SJens Wiklander  * \return          \c 0 on success.
3623d3b0591SJens Wiklander  * \return          #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of
3633d3b0591SJens Wiklander  *                  operations was reached: see \c mbedtls_ecp_set_max_ops().
3643d3b0591SJens Wiklander  * \return          Another \c MBEDTLS_ERR_ECP_XXX error code on failure.
365817466cbSJens Wiklander  */
366817466cbSJens Wiklander int mbedtls_ecdh_make_public( mbedtls_ecdh_context *ctx, size_t *olen,
367817466cbSJens Wiklander                       unsigned char *buf, size_t blen,
368817466cbSJens Wiklander                       int (*f_rng)(void *, unsigned char *, size_t),
369817466cbSJens Wiklander                       void *p_rng );
370817466cbSJens Wiklander 
371817466cbSJens Wiklander /**
3723d3b0591SJens Wiklander  * \brief       This function parses and processes the ECDHE payload of a
3733d3b0591SJens Wiklander  *              TLS ClientKeyExchange message.
374817466cbSJens Wiklander  *
3753d3b0591SJens Wiklander  *              This is the third function used by a TLS server for ECDH(E)
3763d3b0591SJens Wiklander  *              ciphersuites. (It is called after mbedtls_ecdh_setup() and
3773d3b0591SJens Wiklander  *              mbedtls_ecdh_make_params().)
378817466cbSJens Wiklander  *
3793d3b0591SJens Wiklander  * \see         ecp.h
3803d3b0591SJens Wiklander  *
3813d3b0591SJens Wiklander  * \param ctx   The ECDH context to use. This must be initialized
3823d3b0591SJens Wiklander  *              and bound to a group, for example via mbedtls_ecdh_setup().
3833d3b0591SJens Wiklander  * \param buf   The pointer to the ClientKeyExchange payload. This must
3843d3b0591SJens Wiklander  *              be a readable buffer of length \p blen Bytes.
3853d3b0591SJens Wiklander  * \param blen  The length of the input buffer \p buf in Bytes.
3863d3b0591SJens Wiklander  *
3873d3b0591SJens Wiklander  * \return      \c 0 on success.
3883d3b0591SJens Wiklander  * \return      An \c MBEDTLS_ERR_ECP_XXX error code on failure.
389817466cbSJens Wiklander  */
390817466cbSJens Wiklander int mbedtls_ecdh_read_public( mbedtls_ecdh_context *ctx,
391817466cbSJens Wiklander                               const unsigned char *buf, size_t blen );
392817466cbSJens Wiklander 
393817466cbSJens Wiklander /**
3943d3b0591SJens Wiklander  * \brief           This function derives and exports the shared secret.
395817466cbSJens Wiklander  *
3963d3b0591SJens Wiklander  *                  This is the last function used by both TLS client
3973d3b0591SJens Wiklander  *                  and servers.
398817466cbSJens Wiklander  *
3993d3b0591SJens Wiklander  * \note            If \p f_rng is not NULL, it is used to implement
4003d3b0591SJens Wiklander  *                  countermeasures against side-channel attacks.
4013d3b0591SJens Wiklander  *                  For more information, see mbedtls_ecp_mul().
4023d3b0591SJens Wiklander  *
4033d3b0591SJens Wiklander  * \see             ecp.h
4043d3b0591SJens Wiklander 
4053d3b0591SJens Wiklander  * \param ctx       The ECDH context to use. This must be initialized
4063d3b0591SJens Wiklander  *                  and have its own private key generated and the peer's
4073d3b0591SJens Wiklander  *                  public key imported.
4083d3b0591SJens Wiklander  * \param olen      The address at which to store the total number of
4093d3b0591SJens Wiklander  *                  Bytes written on success. This must not be \c NULL.
4103d3b0591SJens Wiklander  * \param buf       The buffer to write the generated shared key to. This
4113d3b0591SJens Wiklander  *                  must be a writable buffer of size \p blen Bytes.
4123d3b0591SJens Wiklander  * \param blen      The length of the destination buffer \p buf in Bytes.
4133d3b0591SJens Wiklander  * \param f_rng     The RNG function, for blinding purposes. This may
4143d3b0591SJens Wiklander  *                  b \c NULL if blinding isn't needed.
4153d3b0591SJens Wiklander  * \param p_rng     The RNG context. This may be \c NULL if \p f_rng
4163d3b0591SJens Wiklander  *                  doesn't need a context argument.
4173d3b0591SJens Wiklander  *
4183d3b0591SJens Wiklander  * \return          \c 0 on success.
4193d3b0591SJens Wiklander  * \return          #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of
4203d3b0591SJens Wiklander  *                  operations was reached: see \c mbedtls_ecp_set_max_ops().
4213d3b0591SJens Wiklander  * \return          Another \c MBEDTLS_ERR_ECP_XXX error code on failure.
422817466cbSJens Wiklander  */
423817466cbSJens Wiklander int mbedtls_ecdh_calc_secret( mbedtls_ecdh_context *ctx, size_t *olen,
424817466cbSJens Wiklander                       unsigned char *buf, size_t blen,
425817466cbSJens Wiklander                       int (*f_rng)(void *, unsigned char *, size_t),
426817466cbSJens Wiklander                       void *p_rng );
427817466cbSJens Wiklander 
4283d3b0591SJens Wiklander #if defined(MBEDTLS_ECP_RESTARTABLE)
4293d3b0591SJens Wiklander /**
4303d3b0591SJens Wiklander  * \brief           This function enables restartable EC computations for this
4313d3b0591SJens Wiklander  *                  context.  (Default: disabled.)
4323d3b0591SJens Wiklander  *
4333d3b0591SJens Wiklander  * \see             \c mbedtls_ecp_set_max_ops()
4343d3b0591SJens Wiklander  *
4353d3b0591SJens Wiklander  * \note            It is not possible to safely disable restartable
4363d3b0591SJens Wiklander  *                  computations once enabled, except by free-ing the context,
4373d3b0591SJens Wiklander  *                  which cancels possible in-progress operations.
4383d3b0591SJens Wiklander  *
4393d3b0591SJens Wiklander  * \param ctx       The ECDH context to use. This must be initialized.
4403d3b0591SJens Wiklander  */
4413d3b0591SJens Wiklander void mbedtls_ecdh_enable_restart( mbedtls_ecdh_context *ctx );
4423d3b0591SJens Wiklander #endif /* MBEDTLS_ECP_RESTARTABLE */
4433d3b0591SJens Wiklander 
444817466cbSJens Wiklander #ifdef __cplusplus
445817466cbSJens Wiklander }
446817466cbSJens Wiklander #endif
447817466cbSJens Wiklander 
448817466cbSJens Wiklander #endif /* ecdh.h */
449