blob: c58a4b6ab8fa931060f9579508d361ae47df4463 [file] [log] [blame]
Manuel Pégourié-Gonnard39d2adb2012-10-31 09:26:55 +01001/**
2 * \file ecp.h
3 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +01004 * \brief This file contains ECP definitions and functions.
5 *
Rose Zadikf56cb342018-04-19 12:49:10 +01006 * The use of Elliptic Curves over GF(P) (ECP) in cryptography and
7 * TLS is defined in <em>Standards for Efficient Cryptography Group
8 * (SECG): SEC1 Elliptic Curve Cryptography</em> and
Rose Zadikd3c9bfc2018-04-17 10:56:55 +01009 * <em>RFC-4492: Elliptic Curve Cryptography (ECC) Cipher Suites
10 * for Transport Layer Security (TLS)</em>.
11 *
12 * <em>RFC-2409: The Internet Key Exchange (IKE)</em> defines ECP
13 * group types.
14 *
Darryl Greena40a1012018-01-05 15:33:17 +000015 */
Rose Zadikd3c9bfc2018-04-17 10:56:55 +010016
17/*
18 * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +020019 * SPDX-License-Identifier: Apache-2.0
20 *
21 * Licensed under the Apache License, Version 2.0 (the "License"); you may
22 * not use this file except in compliance with the License.
23 * You may obtain a copy of the License at
24 *
25 * http://www.apache.org/licenses/LICENSE-2.0
26 *
27 * Unless required by applicable law or agreed to in writing, software
28 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
29 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
30 * See the License for the specific language governing permissions and
31 * limitations under the License.
Manuel Pégourié-Gonnard39d2adb2012-10-31 09:26:55 +010032 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +010033 * This file is part of Mbed TLS (https://tls.mbed.org)
Manuel Pégourié-Gonnard39d2adb2012-10-31 09:26:55 +010034 */
Rose Zadikd3c9bfc2018-04-17 10:56:55 +010035
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020036#ifndef MBEDTLS_ECP_H
37#define MBEDTLS_ECP_H
Manuel Pégourié-Gonnard39d2adb2012-10-31 09:26:55 +010038
Manuel Pégourié-Gonnardbdc96762013-10-03 11:50:39 +020039#include "bignum.h"
Manuel Pégourié-Gonnard39d2adb2012-10-31 09:26:55 +010040
41/*
Manuel Pégourié-Gonnard7cfcea32012-11-05 10:06:12 +010042 * ECP error codes
Manuel Pégourié-Gonnard39d2adb2012-10-31 09:26:55 +010043 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020044#define MBEDTLS_ERR_ECP_BAD_INPUT_DATA -0x4F80 /**< Bad input parameters to function. */
45#define MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL -0x4F00 /**< The buffer is too small to write to. */
Rose Zadikd3c9bfc2018-04-17 10:56:55 +010046#define MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE -0x4E80 /**< The requested curve not available. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020047#define MBEDTLS_ERR_ECP_VERIFY_FAILED -0x4E00 /**< The signature is not valid. */
Manuel Pégourié-Gonnard6a8ca332015-05-28 09:33:39 +020048#define MBEDTLS_ERR_ECP_ALLOC_FAILED -0x4D80 /**< Memory allocation failed. */
Rose Zadikd3c9bfc2018-04-17 10:56:55 +010049#define MBEDTLS_ERR_ECP_RANDOM_FAILED -0x4D00 /**< Generation of random value, such as ephemeral key, failed. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020050#define MBEDTLS_ERR_ECP_INVALID_KEY -0x4C80 /**< Invalid private or public key. */
Gilles Peskine5114d3e2018-03-30 07:12:15 +020051#define MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH -0x4C00 /**< The buffer contains a valid signature followed by more data. */
Rose Zadikd3c9bfc2018-04-17 10:56:55 +010052#define MBEDTLS_ERR_ECP_HW_ACCEL_FAILED -0x4B80 /**< The ECP hardware accelerator failed. */
Manuel Pégourié-Gonnard883f3132012-11-02 09:40:25 +010053
Janos Follathb0697532016-08-18 12:38:46 +010054#if !defined(MBEDTLS_ECP_ALT)
Janos Follathc44ab972016-11-18 16:38:23 +000055/*
56 * default mbed TLS elliptic curve arithmetic implementation
57 *
58 * (in case MBEDTLS_ECP_ALT is defined then the developer has to provide an
59 * alternative implementation for the whole module and it will replace this
60 * one.)
61 */
Janos Follathb0697532016-08-18 12:38:46 +010062
Paul Bakker407a0da2013-06-27 14:29:21 +020063#ifdef __cplusplus
64extern "C" {
65#endif
66
Manuel Pégourié-Gonnard39d2adb2012-10-31 09:26:55 +010067/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +010068 * Definition of domain parameter identifiers: curve, subgroup and generator.
Manuel Pégourié-Gonnard70380392013-09-16 16:19:53 +020069 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +010070 * \note Only curves over prime fields are supported.
Manuel Pégourié-Gonnard70380392013-09-16 16:19:53 +020071 *
72 * \warning This library does not support validation of arbitrary domain
Rose Zadikf56cb342018-04-19 12:49:10 +010073 * parameters. Therefore, only standardized domain parameters from trusted
Manuel Pégourié-Gonnarde3a062b2015-05-11 18:46:47 +020074 * sources should be used. See mbedtls_ecp_group_load().
Manuel Pégourié-Gonnard70380392013-09-16 16:19:53 +020075 */
76typedef enum
77{
Rose Zadikd3c9bfc2018-04-17 10:56:55 +010078 MBEDTLS_ECP_DP_NONE = 0, /*!< Curve not defined. */
79 MBEDTLS_ECP_DP_SECP192R1, /*!< Domain parameters for 192-bit NIST curve. */
80 MBEDTLS_ECP_DP_SECP224R1, /*!< Domain parameters for 224-bit NIST curve. */
81 MBEDTLS_ECP_DP_SECP256R1, /*!< Domain parameters for 256-bit NIST curve. */
82 MBEDTLS_ECP_DP_SECP384R1, /*!< Domain parameters for 384-bit NIST curve. */
83 MBEDTLS_ECP_DP_SECP521R1, /*!< Domain parameters for 521-bit NIST curve. */
84 MBEDTLS_ECP_DP_BP256R1, /*!< Domain parameters for 256-bit Brainpool curve. */
85 MBEDTLS_ECP_DP_BP384R1, /*!< Domain parameters for 384-bit Brainpool curve. */
86 MBEDTLS_ECP_DP_BP512R1, /*!< Domain parameters for 512-bit Brainpool curve. */
87 MBEDTLS_ECP_DP_CURVE25519, /*!< Domain parameters for a Curve25519 curve. */
Rose Zadikf56cb342018-04-19 12:49:10 +010088 MBEDTLS_ECP_DP_CURVE448, /*!< Domain parameters for a Curve448 curve. */
Rose Zadikd3c9bfc2018-04-17 10:56:55 +010089 MBEDTLS_ECP_DP_SECP192K1, /*!< Domain parameters for 192-bit "Koblitz" curve. */
90 MBEDTLS_ECP_DP_SECP224K1, /*!< Domain parameters for 224-bit "Koblitz" curve. */
91 MBEDTLS_ECP_DP_SECP256K1, /*!< Domain parameters for 256-bit "Koblitz" curve. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020092} mbedtls_ecp_group_id;
Manuel Pégourié-Gonnard70380392013-09-16 16:19:53 +020093
94/**
Rose Zadikf56cb342018-04-19 12:49:10 +010095 * The number of supported curves, plus one for #MBEDTLS_ECP_DP_NONE.
Manuel Pégourié-Gonnard66153662013-12-03 14:12:26 +010096 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +010097 * \note Montgomery curves are currently excluded.
Manuel Pégourié-Gonnardf24b4a72013-09-23 18:14:50 +020098 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020099#define MBEDTLS_ECP_DP_MAX 12
Manuel Pégourié-Gonnardf24b4a72013-09-23 18:14:50 +0200100
101/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100102 * Curve information, for use by other modules.
Manuel Pégourié-Gonnard568c9cf2013-09-16 17:30:04 +0200103 */
104typedef struct
105{
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100106 mbedtls_ecp_group_id grp_id; /*!< An internal identifier. */
107 uint16_t tls_id; /*!< The TLS NamedCurve identifier. */
108 uint16_t bit_size; /*!< The size of the curve in bits. */
109 const char *name; /*!< A human-friendly name. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200110} mbedtls_ecp_curve_info;
Manuel Pégourié-Gonnard568c9cf2013-09-16 17:30:04 +0200111
112/**
Rose Zadikf56cb342018-04-19 12:49:10 +0100113 * \brief The ECP point structure, in Jacobian coordinates.
Manuel Pégourié-Gonnardae180d02012-11-02 18:14:40 +0100114 *
Manuel Pégourié-Gonnard1c2782c2012-11-19 20:16:28 +0100115 * \note All functions expect and return points satisfying
Rose Zadikf56cb342018-04-19 12:49:10 +0100116 * the following condition: <code>Z == 0</code> or
117 * <code>Z == 1</code>. Other values of \p Z are
118 * used only by internal functions.
119 * The point is zero, or "at infinity", if <code>Z == 0</code>.
120 * Otherwise, \p X and \p Y are its standard (affine)
121 * coordinates.
Manuel Pégourié-Gonnard39d2adb2012-10-31 09:26:55 +0100122 */
123typedef struct
124{
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100125 mbedtls_mpi X; /*!< The X coordinate of the ECP point. */
126 mbedtls_mpi Y; /*!< The Y coordinate of the ECP point. */
127 mbedtls_mpi Z; /*!< The Z coordinate of the ECP point. */
Manuel Pégourié-Gonnard39d2adb2012-10-31 09:26:55 +0100128}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200129mbedtls_ecp_point;
Manuel Pégourié-Gonnard39d2adb2012-10-31 09:26:55 +0100130
131/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100132 * \brief The ECP group structure.
Manuel Pégourié-Gonnard39d2adb2012-10-31 09:26:55 +0100133 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100134 * We consider two types of curve equations:
Rose Zadikf56cb342018-04-19 12:49:10 +0100135 * <ol><li>Short Weierstrass: <code>y^2 = x^3 + A x + B mod P</code>
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100136 * (SEC1 + RFC-4492)</li>
Rose Zadikf56cb342018-04-19 12:49:10 +0100137 * <li>Montgomery: <code>y^2 = x^3 + A x^2 + x mod P</code> (Curve25519,
138 * Curve448)</li></ol>
139 * In both cases, the generator (\p G) for a prime-order subgroup is fixed.
Manuel Pégourié-Gonnard62aad142012-11-10 00:27:12 +0100140 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100141 * For Short Weierstrass, this subgroup is the whole curve, and its
Rose Zadikf56cb342018-04-19 12:49:10 +0100142 * cardinality is denoted by \p N. Our code requires that \p N is an
143 * odd prime.
Manuel Pégourié-Gonnarddd75c312014-03-31 11:55:42 +0200144 *
Rose Zadikf56cb342018-04-19 12:49:10 +0100145 * For Montgomery curves, we do not store \p A, but <code>(A + 2) / 4</code>,
146 * which is the quantity used in the formulas. Additionally, \p nbits is
147 * not the size of \p N but the required size for private keys.
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100148 *
149 * If \p modp is NULL, reduction modulo \p P is done using a generic algorithm.
Rose Zadikf56cb342018-04-19 12:49:10 +0100150 * Otherwise, \p modp must point to a function that takes an \p mbedtls_mpi in the
151 * range of <code>0..2^(2*pbits)-1</code>, and transforms it in-place to an integer which is
152 * congruent mod \p P to the given MPI, and is close enough to \p pbits in size,
153 * so that it may be efficiently brought in the 0..P-1 range by a few additions
154 * or subtractions. Therefore, it is only an approximative modular reduction.
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100155 *
156 * \return \c 0 on success
Rose Zadikf56cb342018-04-19 12:49:10 +0100157 * \return Non-zero error code on failure.
Manuel Pégourié-Gonnard39d2adb2012-10-31 09:26:55 +0100158 */
159typedef struct
160{
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100161 mbedtls_ecp_group_id id; /*!< An internal group identifier. */
Rose Zadikf56cb342018-04-19 12:49:10 +0100162 mbedtls_mpi P; /*!< The prime modulus of the base field. */
163 mbedtls_mpi A; /*!< For (1) \p A in the equation or for
164 (2) <code>(A + 2) / 4</code>. */
165 mbedtls_mpi B; /*!< For (1) \p B in the equation or
166 for (2) Unused. */
167 mbedtls_ecp_point G; /*!< The generator of the subgroup used. */
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100168 mbedtls_mpi N; /*!< The order of \p G. */
169 size_t pbits; /*!< The number of bits in \p P.*/
Rose Zadikf56cb342018-04-19 12:49:10 +0100170 size_t nbits; /*!< For (1) The number of bits in \p P, or
171 for (2) the private keys. */
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100172 unsigned int h; /*!< \internal 1 if the constants are static. */
Rose Zadikf56cb342018-04-19 12:49:10 +0100173 int (*modp)(mbedtls_mpi *); /*!< The function for fast pseudo-reduction
174 mod \p P (see above).*/
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100175 int (*t_pre)(mbedtls_ecp_point *, void *); /*!< Unused. */
176 int (*t_post)(mbedtls_ecp_point *, void *); /*!< Unused. */
177 void *t_data; /*!< Unused. */
178 mbedtls_ecp_point *T; /*!< Pre-computed points for ecp_mul_comb(). */
179 size_t T_size; /*!< The number for pre-computed points. */
Manuel Pégourié-Gonnard39d2adb2012-10-31 09:26:55 +0100180}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200181mbedtls_ecp_group;
Manuel Pégourié-Gonnard39d2adb2012-10-31 09:26:55 +0100182
183/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100184 * \brief The ECP key-pair structure.
Manuel Pégourié-Gonnardb8c6e0e2013-07-01 13:40:52 +0200185 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100186 * A generic key-pair that may be used for ECDSA and fixed ECDH, for example.
Manuel Pégourié-Gonnard09162dd2013-08-14 18:16:50 +0200187 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100188 * \note Members are deliberately in the same order as in the
189 * #mbedtls_ecdsa_context structure.
Manuel Pégourié-Gonnardb8c6e0e2013-07-01 13:40:52 +0200190 */
191typedef struct
192{
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100193 mbedtls_ecp_group grp; /*!< The elliptic curve and base point. */
194 mbedtls_mpi d; /*!< Our secret value. */
195 mbedtls_ecp_point Q; /*!< Our public value. */
Manuel Pégourié-Gonnardb8c6e0e2013-07-01 13:40:52 +0200196}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200197mbedtls_ecp_keypair;
Manuel Pégourié-Gonnardb8c6e0e2013-07-01 13:40:52 +0200198
Paul Bakker088c5c52014-04-25 11:11:10 +0200199/**
200 * \name SECTION: Module settings
201 *
202 * The configuration options you can set for this module are in this section.
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100203 * Either change them in config.h, or define them using the compiler command line.
Paul Bakker088c5c52014-04-25 11:11:10 +0200204 * \{
205 */
206
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200207#if !defined(MBEDTLS_ECP_MAX_BITS)
Manuel Pégourié-Gonnardb8c6e0e2013-07-01 13:40:52 +0200208/**
Rose Zadikf56cb342018-04-19 12:49:10 +0100209 * The maximum size of the groups, that is, of \c N and \c P.
Manuel Pégourié-Gonnardb63f9e92012-11-21 13:00:58 +0100210 */
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100211#define MBEDTLS_ECP_MAX_BITS 521 /**< The maximum size of groups, in bits. */
Paul Bakkere1b665e2013-12-11 16:02:58 +0100212#endif
213
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200214#define MBEDTLS_ECP_MAX_BYTES ( ( MBEDTLS_ECP_MAX_BITS + 7 ) / 8 )
215#define MBEDTLS_ECP_MAX_PT_LEN ( 2 * MBEDTLS_ECP_MAX_BYTES + 1 )
Manuel Pégourié-Gonnardb63f9e92012-11-21 13:00:58 +0100216
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200217#if !defined(MBEDTLS_ECP_WINDOW_SIZE)
Manuel Pégourié-Gonnard85556072012-11-17 19:54:20 +0100218/*
Manuel Pégourié-Gonnardc30200e2013-11-20 18:39:55 +0100219 * Maximum "window" size used for point multiplication.
220 * Default: 6.
221 * Minimum value: 2. Maximum value: 7.
Manuel Pégourié-Gonnard85556072012-11-17 19:54:20 +0100222 *
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200223 * Result is an array of at most ( 1 << ( MBEDTLS_ECP_WINDOW_SIZE - 1 ) )
Manuel Pégourié-Gonnard9e4191c2013-12-30 18:41:16 +0100224 * points used for point multiplication. This value is directly tied to EC
225 * peak memory usage, so decreasing it by one should roughly cut memory usage
226 * by two (if large curves are in use).
Manuel Pégourié-Gonnard85556072012-11-17 19:54:20 +0100227 *
Manuel Pégourié-Gonnard9e4191c2013-12-30 18:41:16 +0100228 * Reduction in size may reduce speed, but larger curves are impacted first.
229 * Sample performances (in ECDHE handshakes/s, with FIXED_POINT_OPTIM = 1):
230 * w-size: 6 5 4 3 2
231 * 521 145 141 135 120 97
232 * 384 214 209 198 177 146
233 * 256 320 320 303 262 226
Paul Bakker088c5c52014-04-25 11:11:10 +0200234
Manuel Pégourié-Gonnard9e4191c2013-12-30 18:41:16 +0100235 * 224 475 475 453 398 342
236 * 192 640 640 633 587 476
Manuel Pégourié-Gonnard85556072012-11-17 19:54:20 +0100237 */
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100238#define MBEDTLS_ECP_WINDOW_SIZE 6 /**< The maximum window size used. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200239#endif /* MBEDTLS_ECP_WINDOW_SIZE */
Manuel Pégourié-Gonnard9e4191c2013-12-30 18:41:16 +0100240
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200241#if !defined(MBEDTLS_ECP_FIXED_POINT_OPTIM)
Manuel Pégourié-Gonnard9e4191c2013-12-30 18:41:16 +0100242/*
243 * Trade memory for speed on fixed-point multiplication.
244 *
245 * This speeds up repeated multiplication of the generator (that is, the
246 * multiplication in ECDSA signatures, and half of the multiplications in
247 * ECDSA verification and ECDHE) by a factor roughly 3 to 4.
248 *
249 * The cost is increasing EC peak memory usage by a factor roughly 2.
250 *
251 * Change this value to 0 to reduce peak memory usage.
252 */
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100253#define MBEDTLS_ECP_FIXED_POINT_OPTIM 1 /**< Enable fixed-point speed-up. */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200254#endif /* MBEDTLS_ECP_FIXED_POINT_OPTIM */
Manuel Pégourié-Gonnard85556072012-11-17 19:54:20 +0100255
Paul Bakker088c5c52014-04-25 11:11:10 +0200256/* \} name SECTION: Module settings */
257
Manuel Pégourié-Gonnard37d218a2012-11-24 15:19:55 +0100258/*
Manuel Pégourié-Gonnard00794052013-02-09 19:00:07 +0100259 * Point formats, from RFC 4492's enum ECPointFormat
Manuel Pégourié-Gonnard37d218a2012-11-24 15:19:55 +0100260 */
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100261#define MBEDTLS_ECP_PF_UNCOMPRESSED 0 /**< Uncompressed point format. */
262#define MBEDTLS_ECP_PF_COMPRESSED 1 /**< Compressed point format. */
Manuel Pégourié-Gonnard37d218a2012-11-24 15:19:55 +0100263
Manuel Pégourié-Gonnard1a967282013-02-09 17:03:58 +0100264/*
Manuel Pégourié-Gonnard00794052013-02-09 19:00:07 +0100265 * Some other constants from RFC 4492
Manuel Pégourié-Gonnard1a967282013-02-09 17:03:58 +0100266 */
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100267#define MBEDTLS_ECP_TLS_NAMED_CURVE 3 /**< The named_curve of ECCurveType. */
Manuel Pégourié-Gonnard1a967282013-02-09 17:03:58 +0100268
Manuel Pégourié-Gonnard39d2adb2012-10-31 09:26:55 +0100269/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100270 * \brief This function retrieves the information defined in
Rose Zadikf56cb342018-04-19 12:49:10 +0100271 * mbedtls_ecp_curve_info() for all supported curves in order
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100272 * of preference.
Manuel Pégourié-Gonnardda179e42013-09-18 15:31:24 +0200273 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100274 * \return A statically allocated array. The last entry is 0.
Manuel Pégourié-Gonnardda179e42013-09-18 15:31:24 +0200275 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200276const mbedtls_ecp_curve_info *mbedtls_ecp_curve_list( void );
Manuel Pégourié-Gonnardda179e42013-09-18 15:31:24 +0200277
278/**
Rose Zadikf56cb342018-04-19 12:49:10 +0100279 * \brief This function retrieves the list of internal group
280 * identifiers of all supported curves in the order of
281 * preference.
Manuel Pégourié-Gonnardac719412014-02-04 14:48:50 +0100282 *
283 * \return A statically allocated array,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200284 * terminated with MBEDTLS_ECP_DP_NONE.
Manuel Pégourié-Gonnardac719412014-02-04 14:48:50 +0100285 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200286const mbedtls_ecp_group_id *mbedtls_ecp_grp_id_list( void );
Manuel Pégourié-Gonnardac719412014-02-04 14:48:50 +0100287
288/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100289 * \brief This function retrieves curve information from an internal
290 * group identifier.
Manuel Pégourié-Gonnardcae6f3e2013-10-23 20:19:57 +0200291 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100292 * \param grp_id An \c MBEDTLS_ECP_DP_XXX value.
Manuel Pégourié-Gonnardcae6f3e2013-10-23 20:19:57 +0200293 *
Rose Zadikf56cb342018-04-19 12:49:10 +0100294 * \return The associated curve information on success.
295 * \return NULL on failure.
Manuel Pégourié-Gonnardcae6f3e2013-10-23 20:19:57 +0200296 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200297const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_grp_id( mbedtls_ecp_group_id grp_id );
Manuel Pégourié-Gonnardcae6f3e2013-10-23 20:19:57 +0200298
299/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100300 * \brief This function retrieves curve information from a TLS
301 * NamedCurve value.
Manuel Pégourié-Gonnardcae6f3e2013-10-23 20:19:57 +0200302 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100303 * \param tls_id An \c MBEDTLS_ECP_DP_XXX value.
Manuel Pégourié-Gonnardcae6f3e2013-10-23 20:19:57 +0200304 *
Rose Zadikf56cb342018-04-19 12:49:10 +0100305 * \return The associated curve information on success.
306 * \return NULL on failure.
Manuel Pégourié-Gonnardcae6f3e2013-10-23 20:19:57 +0200307 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200308const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_tls_id( uint16_t tls_id );
Manuel Pégourié-Gonnardcae6f3e2013-10-23 20:19:57 +0200309
310/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100311 * \brief This function retrieves curve information from a
312 * human-readable name.
Manuel Pégourié-Gonnard0267e3d2013-11-30 15:10:14 +0100313 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100314 * \param name The human-readable name.
Manuel Pégourié-Gonnard0267e3d2013-11-30 15:10:14 +0100315 *
Rose Zadikf56cb342018-04-19 12:49:10 +0100316 * \return The associated curve information on success.
317 * \return NULL on failure.
Manuel Pégourié-Gonnard0267e3d2013-11-30 15:10:14 +0100318 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200319const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_name( const char *name );
Manuel Pégourié-Gonnard0267e3d2013-11-30 15:10:14 +0100320
321/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100322 * \brief This function initializes a point as zero.
323 *
324 * \param pt The point to initialize.
Manuel Pégourié-Gonnardae180d02012-11-02 18:14:40 +0100325 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200326void mbedtls_ecp_point_init( mbedtls_ecp_point *pt );
Manuel Pégourié-Gonnardae180d02012-11-02 18:14:40 +0100327
328/**
Rose Zadikf56cb342018-04-19 12:49:10 +0100329 * \brief This function initializes an ECP group context
330 * without loading any domain parameters.
331 *
332 * \note After this function is called, domain parameters
333 * for various ECP groups can be loaded through the
334 * mbedtls_ecp_load() or mbedtls_ecp_tls_read_group()
335 * functions.
Manuel Pégourié-Gonnardb505c272012-11-05 17:27:54 +0100336 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200337void mbedtls_ecp_group_init( mbedtls_ecp_group *grp );
Manuel Pégourié-Gonnardb505c272012-11-05 17:27:54 +0100338
339/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100340 * \brief This function initializes a key pair as an invalid one.
341 *
342 * \param key The key pair to initialize.
Manuel Pégourié-Gonnardb8c6e0e2013-07-01 13:40:52 +0200343 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200344void mbedtls_ecp_keypair_init( mbedtls_ecp_keypair *key );
Manuel Pégourié-Gonnardb8c6e0e2013-07-01 13:40:52 +0200345
346/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100347 * \brief This function frees the components of a point.
348 *
349 * \param pt The point to free.
Manuel Pégourié-Gonnard883f3132012-11-02 09:40:25 +0100350 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200351void mbedtls_ecp_point_free( mbedtls_ecp_point *pt );
Manuel Pégourié-Gonnard883f3132012-11-02 09:40:25 +0100352
353/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100354 * \brief This function frees the components of an ECP group.
355 * \param grp The group to free.
Manuel Pégourié-Gonnard883f3132012-11-02 09:40:25 +0100356 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200357void mbedtls_ecp_group_free( mbedtls_ecp_group *grp );
Manuel Pégourié-Gonnard883f3132012-11-02 09:40:25 +0100358
359/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100360 * \brief This function frees the components of a key pair.
361 * \param key The key pair to free.
Manuel Pégourié-Gonnardb8c6e0e2013-07-01 13:40:52 +0200362 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200363void mbedtls_ecp_keypair_free( mbedtls_ecp_keypair *key );
Manuel Pégourié-Gonnardb8c6e0e2013-07-01 13:40:52 +0200364
365/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100366 * \brief This function copies the contents of point \p Q into
367 * point \p P.
Manuel Pégourié-Gonnard883f3132012-11-02 09:40:25 +0100368 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100369 * \param P The destination point.
370 * \param Q The source point.
Manuel Pégourié-Gonnard883f3132012-11-02 09:40:25 +0100371 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100372 * \return \c 0 on success.
Rose Zadikf56cb342018-04-19 12:49:10 +0100373 * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure.
Manuel Pégourié-Gonnard883f3132012-11-02 09:40:25 +0100374 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200375int mbedtls_ecp_copy( mbedtls_ecp_point *P, const mbedtls_ecp_point *Q );
Manuel Pégourié-Gonnard883f3132012-11-02 09:40:25 +0100376
377/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100378 * \brief This function copies the contents of group \p src into
379 * group \p dst.
Manuel Pégourié-Gonnarde09631b2013-08-12 15:44:31 +0200380 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100381 * \param dst The destination group.
382 * \param src The source group.
Manuel Pégourié-Gonnarde09631b2013-08-12 15:44:31 +0200383 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100384 * \return \c 0 on success.
Rose Zadikf56cb342018-04-19 12:49:10 +0100385 * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure.
Manuel Pégourié-Gonnarde09631b2013-08-12 15:44:31 +0200386 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200387int mbedtls_ecp_group_copy( mbedtls_ecp_group *dst, const mbedtls_ecp_group *src );
Manuel Pégourié-Gonnarde09631b2013-08-12 15:44:31 +0200388
389/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100390 * \brief This function sets a point to zero.
Manuel Pégourié-Gonnardcae6f3e2013-10-23 20:19:57 +0200391 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100392 * \param pt The point to set.
Manuel Pégourié-Gonnardcae6f3e2013-10-23 20:19:57 +0200393 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100394 * \return \c 0 on success.
Rose Zadikf56cb342018-04-19 12:49:10 +0100395 * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure.
Manuel Pégourié-Gonnardcae6f3e2013-10-23 20:19:57 +0200396 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200397int mbedtls_ecp_set_zero( mbedtls_ecp_point *pt );
Manuel Pégourié-Gonnardcae6f3e2013-10-23 20:19:57 +0200398
399/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100400 * \brief This function checks if a point is zero.
Manuel Pégourié-Gonnardcae6f3e2013-10-23 20:19:57 +0200401 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100402 * \param pt The point to test.
Manuel Pégourié-Gonnardcae6f3e2013-10-23 20:19:57 +0200403 *
Rose Zadikf56cb342018-04-19 12:49:10 +0100404 * \return \c 1 if the point is zero.
405 * \return \c 0 if the point is non-zero.
Manuel Pégourié-Gonnardcae6f3e2013-10-23 20:19:57 +0200406 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200407int mbedtls_ecp_is_zero( mbedtls_ecp_point *pt );
Manuel Pégourié-Gonnardcae6f3e2013-10-23 20:19:57 +0200408
409/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100410 * \brief This function compares two points.
Manuel Pégourié-Gonnard6029a852015-08-11 15:44:41 +0200411 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100412 * \note This assumes that the points are normalized. Otherwise,
Manuel Pégourié-Gonnard6029a852015-08-11 15:44:41 +0200413 * they may compare as "not equal" even if they are.
414 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100415 * \param P The first point to compare.
416 * \param Q The second point to compare.
Manuel Pégourié-Gonnard6029a852015-08-11 15:44:41 +0200417 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100418 * \return \c 0 if the points are equal.
419 * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if the points are not equal.
Manuel Pégourié-Gonnard6029a852015-08-11 15:44:41 +0200420 */
421int mbedtls_ecp_point_cmp( const mbedtls_ecp_point *P,
422 const mbedtls_ecp_point *Q );
423
424/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100425 * \brief This function imports a non-zero point from two ASCII
426 * strings.
Manuel Pégourié-Gonnard847395a2012-11-05 13:13:44 +0100427 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100428 * \param P The destination point.
429 * \param radix The numeric base of the input.
430 * \param x The first affine coordinate, as a null-terminated string.
431 * \param y The second affine coordinate, as a null-terminated string.
Manuel Pégourié-Gonnard847395a2012-11-05 13:13:44 +0100432 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100433 * \return \c 0 on success.
434 * \return An \c MBEDTLS_ERR_MPI_XXX error code on failure.
Manuel Pégourié-Gonnard847395a2012-11-05 13:13:44 +0100435 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200436int mbedtls_ecp_point_read_string( mbedtls_ecp_point *P, int radix,
Manuel Pégourié-Gonnard847395a2012-11-05 13:13:44 +0100437 const char *x, const char *y );
438
439/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100440 * \brief This function exports a point into unsigned binary data.
Manuel Pégourié-Gonnarde19feb52012-11-24 14:10:14 +0100441 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100442 * \param grp The group to which the point should belong.
443 * \param P The point to export.
444 * \param format The point format. Should be an \c MBEDTLS_ECP_PF_XXX macro.
445 * \param olen The length of the output.
446 * \param buf The output buffer.
447 * \param buflen The length of the output buffer.
Manuel Pégourié-Gonnarde19feb52012-11-24 14:10:14 +0100448 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100449 * \return \c 0 on success.
450 * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA
451 * or #MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL on failure.
Manuel Pégourié-Gonnarde19feb52012-11-24 14:10:14 +0100452 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200453int mbedtls_ecp_point_write_binary( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *P,
Manuel Pégourié-Gonnard420f1eb2013-02-10 12:22:46 +0100454 int format, size_t *olen,
Manuel Pégourié-Gonnard7e860252013-02-10 10:58:48 +0100455 unsigned char *buf, size_t buflen );
Manuel Pégourié-Gonnarde19feb52012-11-24 14:10:14 +0100456
457/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100458 * \brief This function imports a point from unsigned binary data.
Manuel Pégourié-Gonnard5e402d82012-11-24 16:19:42 +0100459 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100460 * \note This function does not check that the point actually
461 * belongs to the given group, see mbedtls_ecp_check_pubkey()
462 * for that.
Manuel Pégourié-Gonnard5e402d82012-11-24 16:19:42 +0100463 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100464 * \param grp The group to which the point should belong.
465 * \param P The point to import.
466 * \param buf The input buffer.
467 * \param ilen The length of the input.
468 *
469 * \return \c 0 on success.
470 * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if input is invalid.
Rose Zadikf56cb342018-04-19 12:49:10 +0100471 * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure.
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100472 * \return #MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE if the point format
Manuel Pégourié-Gonnard5246ee52014-03-19 16:18:38 +0100473 * is not implemented.
Manuel Pégourié-Gonnard5e402d82012-11-24 16:19:42 +0100474 *
Manuel Pégourié-Gonnard5e402d82012-11-24 16:19:42 +0100475 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200476int mbedtls_ecp_point_read_binary( const mbedtls_ecp_group *grp, mbedtls_ecp_point *P,
Manuel Pégourié-Gonnard7e860252013-02-10 10:58:48 +0100477 const unsigned char *buf, size_t ilen );
Manuel Pégourié-Gonnard1a967282013-02-09 17:03:58 +0100478
Manuel Pégourié-Gonnard5e402d82012-11-24 16:19:42 +0100479/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100480 * \brief This function imports a point from a TLS ECPoint record.
Manuel Pégourié-Gonnardcae6f3e2013-10-23 20:19:57 +0200481 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100482 * \note On function return, \p buf is updated to point to immediately
Rose Zadikf56cb342018-04-19 12:49:10 +0100483 * after the ECPoint record.
Manuel Pégourié-Gonnardcae6f3e2013-10-23 20:19:57 +0200484 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100485 * \param grp The ECP group used.
486 * \param pt The destination point.
Rose Zadikf56cb342018-04-19 12:49:10 +0100487 * \param buf The address of the pointer to the start of the input buffer.
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100488 * \param len The length of the buffer.
Manuel Pégourié-Gonnard150c4f62014-11-21 09:14:52 +0100489 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100490 * \return \c 0 on success.
Rose Zadikf56cb342018-04-19 12:49:10 +0100491 * \return An \c MBEDTLS_ERR_MPI_XXX error code on initialization failure.
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100492 * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if input is invalid.
Manuel Pégourié-Gonnardcae6f3e2013-10-23 20:19:57 +0200493 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200494int mbedtls_ecp_tls_read_point( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt,
Manuel Pégourié-Gonnardcae6f3e2013-10-23 20:19:57 +0200495 const unsigned char **buf, size_t len );
496
497/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100498 * \brief This function exports a point as a TLS ECPoint record.
Manuel Pégourié-Gonnardcae6f3e2013-10-23 20:19:57 +0200499 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100500 * \param grp The ECP group used.
501 * \param pt The point to export.
502 * \param format The export format.
Rose Zadikf56cb342018-04-19 12:49:10 +0100503 * \param olen The length of the data written.
504 * \param buf The buffer to write to.
505 * \param blen The length of the buffer.
Manuel Pégourié-Gonnardcae6f3e2013-10-23 20:19:57 +0200506 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100507 * \return \c 0 on success.
508 * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA or
509 * #MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL on failure.
Manuel Pégourié-Gonnardcae6f3e2013-10-23 20:19:57 +0200510 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200511int mbedtls_ecp_tls_write_point( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt,
Manuel Pégourié-Gonnardcae6f3e2013-10-23 20:19:57 +0200512 int format, size_t *olen,
513 unsigned char *buf, size_t blen );
514
515/**
Rose Zadikf56cb342018-04-19 12:49:10 +0100516 * \brief This function sets a group using standardized domain parameters.
Manuel Pégourié-Gonnarda5402fe2012-11-07 20:24:05 +0100517 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100518 * \note The index should be a value of the NamedCurve enum,
519 * as defined in <em>RFC-4492: Elliptic Curve Cryptography
520 * (ECC) Cipher Suites for Transport Layer Security (TLS)</em>,
521 * usually in the form of an \c MBEDTLS_ECP_DP_XXX macro.
Manuel Pégourié-Gonnarda5402fe2012-11-07 20:24:05 +0100522 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100523 * \param grp The destination group.
Rose Zadikf56cb342018-04-19 12:49:10 +0100524 * \param id The identifier of the domain parameter set to load.
Manuel Pégourié-Gonnarda5402fe2012-11-07 20:24:05 +0100525 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100526 * \return \c 0 on success,
Rose Zadikf56cb342018-04-19 12:49:10 +0100527 * \return An \c MBEDTLS_ERR_MPI_XXX error code on initialization failure.
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100528 * \return #MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE for unkownn groups.
529
Manuel Pégourié-Gonnarda5402fe2012-11-07 20:24:05 +0100530 */
Hanno Becker61937d42017-04-26 15:01:23 +0100531int mbedtls_ecp_group_load( mbedtls_ecp_group *grp, mbedtls_ecp_group_id id );
Manuel Pégourié-Gonnard1a967282013-02-09 17:03:58 +0100532
533/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100534 * \brief This function sets a group from a TLS ECParameters record.
Manuel Pégourié-Gonnard1a967282013-02-09 17:03:58 +0100535 *
Rose Zadikf56cb342018-04-19 12:49:10 +0100536 * \note \p buf is updated to point right after the ECParameters record
537 * on exit.
Manuel Pégourié-Gonnard1a967282013-02-09 17:03:58 +0100538 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100539 * \param grp The destination group.
Rose Zadikf56cb342018-04-19 12:49:10 +0100540 * \param buf The address of the pointer to the start of the input buffer.
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100541 * \param len The length of the buffer.
Manuel Pégourié-Gonnard150c4f62014-11-21 09:14:52 +0100542 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100543 * \return \c 0 on success.
Rose Zadikf56cb342018-04-19 12:49:10 +0100544 * \return An \c MBEDTLS_ERR_MPI_XXX error code on initialization failure.
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100545 * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if input is invalid.
Manuel Pégourié-Gonnard1a967282013-02-09 17:03:58 +0100546 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200547int mbedtls_ecp_tls_read_group( mbedtls_ecp_group *grp, const unsigned char **buf, size_t len );
Manuel Pégourié-Gonnarda5402fe2012-11-07 20:24:05 +0100548
549/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100550 * \brief This function writes the TLS ECParameters record for a group.
Manuel Pégourié-Gonnardb3258872013-02-10 12:06:19 +0100551 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100552 * \param grp The ECP group used.
553 * \param olen The number of Bytes written.
554 * \param buf The buffer to write to.
555 * \param blen The length of the buffer.
Manuel Pégourié-Gonnardb3258872013-02-10 12:06:19 +0100556 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100557 * \return \c 0 on success.
558 * \return #MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL on failure.
Manuel Pégourié-Gonnardb3258872013-02-10 12:06:19 +0100559 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200560int mbedtls_ecp_tls_write_group( const mbedtls_ecp_group *grp, size_t *olen,
Manuel Pégourié-Gonnardb3258872013-02-10 12:06:19 +0100561 unsigned char *buf, size_t blen );
562
563/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100564 * \brief This function performs multiplication of a point by
565 * an integer: \p R = \p m * \p P.
Manuel Pégourié-Gonnard39d2adb2012-10-31 09:26:55 +0100566 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100567 * It is not thread-safe to use same group in multiple threads.
Manuel Pégourié-Gonnard56cc88a2015-05-11 18:40:45 +0200568 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100569 * \note To prevent timing attacks, this function
570 * executes the exact same sequence of base-field
571 * operations for any valid \p m. It avoids any if-branch or
572 * array index depending on the value of \p m.
Manuel Pégourié-Gonnard56cc88a2015-05-11 18:40:45 +0200573 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100574 * \note If \p f_rng is not NULL, it is used to randomize
575 * intermediate results to prevent potential timing attacks
576 * targeting these results. We recommend always providing
577 * a non-NULL \p f_rng. The overhead is negligible.
Manuel Pégourié-Gonnard39d2adb2012-10-31 09:26:55 +0100578 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100579 * \param grp The ECP group.
580 * \param R The destination point.
581 * \param m The integer by which to multiply.
582 * \param P The point to multiply.
583 * \param f_rng The RNG function.
584 * \param p_rng The RNG context.
585 *
586 * \return \c 0 on success.
Rose Zadikf56cb342018-04-19 12:49:10 +0100587 * \return #MBEDTLS_ERR_ECP_INVALID_KEY if \p m is not a valid private
588 * key, or \p P is not a valid public key.
589 * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure.
Manuel Pégourié-Gonnard39d2adb2012-10-31 09:26:55 +0100590 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200591int mbedtls_ecp_mul( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
592 const mbedtls_mpi *m, const mbedtls_ecp_point *P,
Manuel Pégourié-Gonnard09ceaf42013-11-20 23:06:14 +0100593 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
Manuel Pégourié-Gonnard39d2adb2012-10-31 09:26:55 +0100594
595/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100596 * \brief This function performs multiplication and addition of two
597 * points by integers: \p R = \p m * \p P + \p n * \p Q
598
599 * It is not thread-safe to use same group in multiple threads.
Manuel Pégourié-Gonnard56cc88a2015-05-11 18:40:45 +0200600 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100601 * \note In contrast to mbedtls_ecp_mul(), this function does not
602 * guarantee a constant execution flow and timing.
Manuel Pégourié-Gonnard56cc88a2015-05-11 18:40:45 +0200603 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100604 * \param grp The ECP group.
605 * \param R The destination point.
606 * \param m The integer by which to multiply \p P.
607 * \param P The point to multiply by \p m.
608 * \param n The integer by which to multiply \p Q.
609 * \param Q The point to be multiplied by \p n.
Manuel Pégourié-Gonnard56cc88a2015-05-11 18:40:45 +0200610 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100611 * \return \c 0 on success.
612 * \return #MBEDTLS_ERR_ECP_INVALID_KEY if \p m or \p n are not
613 * valid private keys, or \p P or \p Q are not valid public
614 * keys.
Rose Zadikf56cb342018-04-19 12:49:10 +0100615 * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure.
Manuel Pégourié-Gonnard56cc88a2015-05-11 18:40:45 +0200616 */
617int mbedtls_ecp_muladd( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
618 const mbedtls_mpi *m, const mbedtls_ecp_point *P,
619 const mbedtls_mpi *n, const mbedtls_ecp_point *Q );
620
621/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100622 * \brief This function checks that a point is a valid public key
623 * on this curve.
Manuel Pégourié-Gonnardc8dc2952013-07-01 14:06:13 +0200624 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100625 * It only checks that the point is non-zero, has
626 * valid coordinates and lies on the curve. It does not verify
627 * that it is indeed a multiple of \p G. This additional
628 * check is computationally more expensive, is not required
629 * by standards, and should not be necessary if the group
630 * used has a small cofactor. In particular, it is useless for
631 * the NIST groups which all have a cofactor of 1.
Manuel Pégourié-Gonnardc8dc2952013-07-01 14:06:13 +0200632 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100633 * \note This function uses bare components rather than an
634 * mbedtls_ecp_keypair() structure, to ease use with other
635 * structures. For example, mbedtls_ecdh_context() or
636 * mbedtls_ecdsa_context().
Manuel Pégourié-Gonnardc8dc2952013-07-01 14:06:13 +0200637 *
Rose Zadikf56cb342018-04-19 12:49:10 +0100638 * \param grp The curve the point should lie on.
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100639 * \param pt The point to check.
Manuel Pégourié-Gonnardc8dc2952013-07-01 14:06:13 +0200640 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100641 * \return \c 0 if the point is a valid public key.
Rose Zadikf56cb342018-04-19 12:49:10 +0100642 * \return #MBEDTLS_ERR_ECP_INVALID_KEY on failure.
Manuel Pégourié-Gonnardc8dc2952013-07-01 14:06:13 +0200643 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200644int mbedtls_ecp_check_pubkey( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt );
Manuel Pégourié-Gonnardc8dc2952013-07-01 14:06:13 +0200645
646/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100647 * \brief This function checks that an \p mbedtls_mpi is a valid private
648 * key for this curve.
Manuel Pégourié-Gonnardc8dc2952013-07-01 14:06:13 +0200649 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100650 * \note This function uses bare components rather than an
651 * mbedtls_ecp_keypair() structure to ease use with other
652 * structures such as mbedtls_ecdh_context() or
653 * mbedtls_ecdsa_context().
Manuel Pégourié-Gonnardc8dc2952013-07-01 14:06:13 +0200654 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100655 * \param grp The group used.
656 * \param d The integer to check.
Manuel Pégourié-Gonnardc8dc2952013-07-01 14:06:13 +0200657 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100658 * \return \c 0 if the point is a valid private key.
Rose Zadikf56cb342018-04-19 12:49:10 +0100659 * \return #MBEDTLS_ERR_ECP_INVALID_KEY on failure.
Manuel Pégourié-Gonnardc8dc2952013-07-01 14:06:13 +0200660 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200661int mbedtls_ecp_check_privkey( const mbedtls_ecp_group *grp, const mbedtls_mpi *d );
Manuel Pégourié-Gonnardc8dc2952013-07-01 14:06:13 +0200662
663/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100664 * \brief This function generates a keypair with a configurable base
665 * point.
Manuel Pégourié-Gonnardd9a3f472015-08-11 14:31:03 +0200666 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100667 * \note This function uses bare components rather than an
668 * mbedtls_ecp_keypair() structure to ease use with other
669 * structures such as mbedtls_ecdh_context() or
670 * mbedtls_ecdsa_context().
671*
672 * \param grp The ECP group.
673 * \param G The chosen base point.
674 * \param d The destination MPI (secret part).
675 * \param Q The destination point (public part).
676 * \param f_rng The RNG function.
677 * \param p_rng The RNG context.
Manuel Pégourié-Gonnardd9a3f472015-08-11 14:31:03 +0200678 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100679 * \return \c 0 on success.
680 * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX error code
681 * on failure.
682 */
Manuel Pégourié-Gonnardd9a3f472015-08-11 14:31:03 +0200683int mbedtls_ecp_gen_keypair_base( mbedtls_ecp_group *grp,
684 const mbedtls_ecp_point *G,
685 mbedtls_mpi *d, mbedtls_ecp_point *Q,
686 int (*f_rng)(void *, unsigned char *, size_t),
687 void *p_rng );
688
689/**
Rose Zadikf56cb342018-04-19 12:49:10 +0100690 * \brief This function generates an ECP keypair.
Manuel Pégourié-Gonnard45a035a2013-01-26 14:42:45 +0100691 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100692 * \note This function uses bare components rather than an
693 * mbedtls_ecp_keypair() structure to ease use with other
694 * structures such as mbedtls_ecdh_context() or
695 * mbedtls_ecdsa_context().
Manuel Pégourié-Gonnard45a035a2013-01-26 14:42:45 +0100696 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100697 * \param grp The ECP group.
698 * \param d The destination MPI (secret part).
699 * \param Q The destination point (public part).
700 * \param f_rng The RNG function.
701 * \param p_rng The RNG context.
Manuel Pégourié-Gonnardc8dc2952013-07-01 14:06:13 +0200702 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100703 * \return \c 0 on success.
704 * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX error code
705 * on failure.
Manuel Pégourié-Gonnard45a035a2013-01-26 14:42:45 +0100706 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200707int mbedtls_ecp_gen_keypair( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q,
Manuel Pégourié-Gonnard45a035a2013-01-26 14:42:45 +0100708 int (*f_rng)(void *, unsigned char *, size_t),
709 void *p_rng );
710
711/**
Rose Zadikf56cb342018-04-19 12:49:10 +0100712 * \brief This function generates an ECP key.
Manuel Pégourié-Gonnard104ee1d2013-11-30 14:13:16 +0100713 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100714 * \param grp_id The ECP group identifier.
715 * \param key The destination key.
716 * \param f_rng The RNG function.
717 * \param p_rng The RNG context.
Manuel Pégourié-Gonnard104ee1d2013-11-30 14:13:16 +0100718 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100719 * \return \c 0 on success.
720 * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX error code
721 * on failure.
Manuel Pégourié-Gonnard104ee1d2013-11-30 14:13:16 +0100722 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200723int mbedtls_ecp_gen_key( mbedtls_ecp_group_id grp_id, mbedtls_ecp_keypair *key,
Manuel Pégourié-Gonnard104ee1d2013-11-30 14:13:16 +0100724 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
725
Manuel Pégourié-Gonnard30668d62014-11-06 15:25:32 +0100726/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100727 * \brief This function checks a public-private key pair.
Manuel Pégourié-Gonnard30668d62014-11-06 15:25:32 +0100728 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100729 * \param pub The keypair structure holding the public key.
730 * \param prv The keypair structure holding the private key.
Manuel Pégourié-Gonnard30668d62014-11-06 15:25:32 +0100731 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100732 * \note The both are keypairs, and may optionally hold the corresponding other key, but the public key passed in thee pub is checked against the private key passed in prv.
733 *
734 * \return \c 0 on success - the keys are valid and match.
735 * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA, or an \c
736 * MBEDTLS_ERR_ECP_XXX or an \c MBEDTLS_ERR_MPI_XXX
737 * error code on failure.
Manuel Pégourié-Gonnard30668d62014-11-06 15:25:32 +0100738 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200739int mbedtls_ecp_check_pub_priv( const mbedtls_ecp_keypair *pub, const mbedtls_ecp_keypair *prv );
Manuel Pégourié-Gonnard30668d62014-11-06 15:25:32 +0100740
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200741#if defined(MBEDTLS_SELF_TEST)
Janos Follathb0697532016-08-18 12:38:46 +0100742
Manuel Pégourié-Gonnard104ee1d2013-11-30 14:13:16 +0100743/**
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100744 * \brief The ECP checkup routine.
Manuel Pégourié-Gonnard39d2adb2012-10-31 09:26:55 +0100745 *
Rose Zadikd3c9bfc2018-04-17 10:56:55 +0100746 * \return \c 0 on success.
747 * \return \c 1 on failure.
Manuel Pégourié-Gonnard39d2adb2012-10-31 09:26:55 +0100748 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200749int mbedtls_ecp_self_test( int verbose );
Janos Follathb0697532016-08-18 12:38:46 +0100750
Janos Follath372697b2016-10-28 16:53:11 +0100751#endif /* MBEDTLS_SELF_TEST */
Manuel Pégourié-Gonnard39d2adb2012-10-31 09:26:55 +0100752
753#ifdef __cplusplus
754}
755#endif
756
Janos Follathb0697532016-08-18 12:38:46 +0100757#else /* MBEDTLS_ECP_ALT */
758#include "ecp_alt.h"
759#endif /* MBEDTLS_ECP_ALT */
760
Paul Bakker9af723c2014-05-01 13:03:14 +0200761#endif /* ecp.h */