mbed client lightswitch demo

Dependencies:   mbed Socket lwip-eth lwip-sys lwip

Fork of mbed-client-classic-example-lwip by Austin Blackstone

Committer:
mbedAustin
Date:
Thu Jun 09 17:08:36 2016 +0000
Revision:
11:cada08fc8a70
Commit for public Consumption

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbedAustin 11:cada08fc8a70 1 /**
mbedAustin 11:cada08fc8a70 2 * \file ecp.h
mbedAustin 11:cada08fc8a70 3 *
mbedAustin 11:cada08fc8a70 4 * \brief Elliptic curves over GF(p)
mbedAustin 11:cada08fc8a70 5 *
mbedAustin 11:cada08fc8a70 6 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
mbedAustin 11:cada08fc8a70 7 * SPDX-License-Identifier: Apache-2.0
mbedAustin 11:cada08fc8a70 8 *
mbedAustin 11:cada08fc8a70 9 * Licensed under the Apache License, Version 2.0 (the "License"); you may
mbedAustin 11:cada08fc8a70 10 * not use this file except in compliance with the License.
mbedAustin 11:cada08fc8a70 11 * You may obtain a copy of the License at
mbedAustin 11:cada08fc8a70 12 *
mbedAustin 11:cada08fc8a70 13 * http://www.apache.org/licenses/LICENSE-2.0
mbedAustin 11:cada08fc8a70 14 *
mbedAustin 11:cada08fc8a70 15 * Unless required by applicable law or agreed to in writing, software
mbedAustin 11:cada08fc8a70 16 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
mbedAustin 11:cada08fc8a70 17 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbedAustin 11:cada08fc8a70 18 * See the License for the specific language governing permissions and
mbedAustin 11:cada08fc8a70 19 * limitations under the License.
mbedAustin 11:cada08fc8a70 20 *
mbedAustin 11:cada08fc8a70 21 * This file is part of mbed TLS (https://tls.mbed.org)
mbedAustin 11:cada08fc8a70 22 */
mbedAustin 11:cada08fc8a70 23 #ifndef MBEDTLS_ECP_H
mbedAustin 11:cada08fc8a70 24 #define MBEDTLS_ECP_H
mbedAustin 11:cada08fc8a70 25
mbedAustin 11:cada08fc8a70 26 #include "bignum.h"
mbedAustin 11:cada08fc8a70 27
mbedAustin 11:cada08fc8a70 28 /*
mbedAustin 11:cada08fc8a70 29 * ECP error codes
mbedAustin 11:cada08fc8a70 30 */
mbedAustin 11:cada08fc8a70 31 #define MBEDTLS_ERR_ECP_BAD_INPUT_DATA -0x4F80 /**< Bad input parameters to function. */
mbedAustin 11:cada08fc8a70 32 #define MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL -0x4F00 /**< The buffer is too small to write to. */
mbedAustin 11:cada08fc8a70 33 #define MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE -0x4E80 /**< Requested curve not available. */
mbedAustin 11:cada08fc8a70 34 #define MBEDTLS_ERR_ECP_VERIFY_FAILED -0x4E00 /**< The signature is not valid. */
mbedAustin 11:cada08fc8a70 35 #define MBEDTLS_ERR_ECP_ALLOC_FAILED -0x4D80 /**< Memory allocation failed. */
mbedAustin 11:cada08fc8a70 36 #define MBEDTLS_ERR_ECP_RANDOM_FAILED -0x4D00 /**< Generation of random value, such as (ephemeral) key, failed. */
mbedAustin 11:cada08fc8a70 37 #define MBEDTLS_ERR_ECP_INVALID_KEY -0x4C80 /**< Invalid private or public key. */
mbedAustin 11:cada08fc8a70 38 #define MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH -0x4C00 /**< Signature is valid but shorter than the user-supplied length. */
mbedAustin 11:cada08fc8a70 39
mbedAustin 11:cada08fc8a70 40 #ifdef __cplusplus
mbedAustin 11:cada08fc8a70 41 extern "C" {
mbedAustin 11:cada08fc8a70 42 #endif
mbedAustin 11:cada08fc8a70 43
mbedAustin 11:cada08fc8a70 44 /**
mbedAustin 11:cada08fc8a70 45 * Domain parameters (curve, subgroup and generator) identifiers.
mbedAustin 11:cada08fc8a70 46 *
mbedAustin 11:cada08fc8a70 47 * Only curves over prime fields are supported.
mbedAustin 11:cada08fc8a70 48 *
mbedAustin 11:cada08fc8a70 49 * \warning This library does not support validation of arbitrary domain
mbedAustin 11:cada08fc8a70 50 * parameters. Therefore, only well-known domain parameters from trusted
mbedAustin 11:cada08fc8a70 51 * sources should be used. See mbedtls_ecp_group_load().
mbedAustin 11:cada08fc8a70 52 */
mbedAustin 11:cada08fc8a70 53 typedef enum
mbedAustin 11:cada08fc8a70 54 {
mbedAustin 11:cada08fc8a70 55 MBEDTLS_ECP_DP_NONE = 0,
mbedAustin 11:cada08fc8a70 56 MBEDTLS_ECP_DP_SECP192R1, /*!< 192-bits NIST curve */
mbedAustin 11:cada08fc8a70 57 MBEDTLS_ECP_DP_SECP224R1, /*!< 224-bits NIST curve */
mbedAustin 11:cada08fc8a70 58 MBEDTLS_ECP_DP_SECP256R1, /*!< 256-bits NIST curve */
mbedAustin 11:cada08fc8a70 59 MBEDTLS_ECP_DP_SECP384R1, /*!< 384-bits NIST curve */
mbedAustin 11:cada08fc8a70 60 MBEDTLS_ECP_DP_SECP521R1, /*!< 521-bits NIST curve */
mbedAustin 11:cada08fc8a70 61 MBEDTLS_ECP_DP_BP256R1, /*!< 256-bits Brainpool curve */
mbedAustin 11:cada08fc8a70 62 MBEDTLS_ECP_DP_BP384R1, /*!< 384-bits Brainpool curve */
mbedAustin 11:cada08fc8a70 63 MBEDTLS_ECP_DP_BP512R1, /*!< 512-bits Brainpool curve */
mbedAustin 11:cada08fc8a70 64 MBEDTLS_ECP_DP_CURVE25519, /*!< Curve25519 */
mbedAustin 11:cada08fc8a70 65 MBEDTLS_ECP_DP_SECP192K1, /*!< 192-bits "Koblitz" curve */
mbedAustin 11:cada08fc8a70 66 MBEDTLS_ECP_DP_SECP224K1, /*!< 224-bits "Koblitz" curve */
mbedAustin 11:cada08fc8a70 67 MBEDTLS_ECP_DP_SECP256K1, /*!< 256-bits "Koblitz" curve */
mbedAustin 11:cada08fc8a70 68 } mbedtls_ecp_group_id;
mbedAustin 11:cada08fc8a70 69
mbedAustin 11:cada08fc8a70 70 /**
mbedAustin 11:cada08fc8a70 71 * Number of supported curves (plus one for NONE).
mbedAustin 11:cada08fc8a70 72 *
mbedAustin 11:cada08fc8a70 73 * (Montgomery curves excluded for now.)
mbedAustin 11:cada08fc8a70 74 */
mbedAustin 11:cada08fc8a70 75 #define MBEDTLS_ECP_DP_MAX 12
mbedAustin 11:cada08fc8a70 76
mbedAustin 11:cada08fc8a70 77 /**
mbedAustin 11:cada08fc8a70 78 * Curve information for use by other modules
mbedAustin 11:cada08fc8a70 79 */
mbedAustin 11:cada08fc8a70 80 typedef struct
mbedAustin 11:cada08fc8a70 81 {
mbedAustin 11:cada08fc8a70 82 mbedtls_ecp_group_id grp_id; /*!< Internal identifier */
mbedAustin 11:cada08fc8a70 83 uint16_t tls_id; /*!< TLS NamedCurve identifier */
mbedAustin 11:cada08fc8a70 84 uint16_t bit_size; /*!< Curve size in bits */
mbedAustin 11:cada08fc8a70 85 const char *name; /*!< Human-friendly name */
mbedAustin 11:cada08fc8a70 86 } mbedtls_ecp_curve_info;
mbedAustin 11:cada08fc8a70 87
mbedAustin 11:cada08fc8a70 88 /**
mbedAustin 11:cada08fc8a70 89 * \brief ECP point structure (jacobian coordinates)
mbedAustin 11:cada08fc8a70 90 *
mbedAustin 11:cada08fc8a70 91 * \note All functions expect and return points satisfying
mbedAustin 11:cada08fc8a70 92 * the following condition: Z == 0 or Z == 1. (Other
mbedAustin 11:cada08fc8a70 93 * values of Z are used by internal functions only.)
mbedAustin 11:cada08fc8a70 94 * The point is zero, or "at infinity", if Z == 0.
mbedAustin 11:cada08fc8a70 95 * Otherwise, X and Y are its standard (affine) coordinates.
mbedAustin 11:cada08fc8a70 96 */
mbedAustin 11:cada08fc8a70 97 typedef struct
mbedAustin 11:cada08fc8a70 98 {
mbedAustin 11:cada08fc8a70 99 mbedtls_mpi X; /*!< the point's X coordinate */
mbedAustin 11:cada08fc8a70 100 mbedtls_mpi Y; /*!< the point's Y coordinate */
mbedAustin 11:cada08fc8a70 101 mbedtls_mpi Z; /*!< the point's Z coordinate */
mbedAustin 11:cada08fc8a70 102 }
mbedAustin 11:cada08fc8a70 103 mbedtls_ecp_point;
mbedAustin 11:cada08fc8a70 104
mbedAustin 11:cada08fc8a70 105 /**
mbedAustin 11:cada08fc8a70 106 * \brief ECP group structure
mbedAustin 11:cada08fc8a70 107 *
mbedAustin 11:cada08fc8a70 108 * We consider two types of curves equations:
mbedAustin 11:cada08fc8a70 109 * 1. Short Weierstrass y^2 = x^3 + A x + B mod P (SEC1 + RFC 4492)
mbedAustin 11:cada08fc8a70 110 * 2. Montgomery, y^2 = x^3 + A x^2 + x mod P (Curve25519 + draft)
mbedAustin 11:cada08fc8a70 111 * In both cases, a generator G for a prime-order subgroup is fixed. In the
mbedAustin 11:cada08fc8a70 112 * short weierstrass, this subgroup is actually the whole curve, and its
mbedAustin 11:cada08fc8a70 113 * cardinal is denoted by N.
mbedAustin 11:cada08fc8a70 114 *
mbedAustin 11:cada08fc8a70 115 * In the case of Short Weierstrass curves, our code requires that N is an odd
mbedAustin 11:cada08fc8a70 116 * prime. (Use odd in mbedtls_ecp_mul() and prime in mbedtls_ecdsa_sign() for blinding.)
mbedAustin 11:cada08fc8a70 117 *
mbedAustin 11:cada08fc8a70 118 * In the case of Montgomery curves, we don't store A but (A + 2) / 4 which is
mbedAustin 11:cada08fc8a70 119 * the quantity actually used in the formulas. Also, nbits is not the size of N
mbedAustin 11:cada08fc8a70 120 * but the required size for private keys.
mbedAustin 11:cada08fc8a70 121 *
mbedAustin 11:cada08fc8a70 122 * If modp is NULL, reduction modulo P is done using a generic algorithm.
mbedAustin 11:cada08fc8a70 123 * Otherwise, it must point to a function that takes an mbedtls_mpi in the range
mbedAustin 11:cada08fc8a70 124 * 0..2^(2*pbits)-1 and transforms it in-place in an integer of little more
mbedAustin 11:cada08fc8a70 125 * than pbits, so that the integer may be efficiently brought in the 0..P-1
mbedAustin 11:cada08fc8a70 126 * range by a few additions or substractions. It must return 0 on success and
mbedAustin 11:cada08fc8a70 127 * non-zero on failure.
mbedAustin 11:cada08fc8a70 128 */
mbedAustin 11:cada08fc8a70 129 typedef struct
mbedAustin 11:cada08fc8a70 130 {
mbedAustin 11:cada08fc8a70 131 mbedtls_ecp_group_id id; /*!< internal group identifier */
mbedAustin 11:cada08fc8a70 132 mbedtls_mpi P; /*!< prime modulus of the base field */
mbedAustin 11:cada08fc8a70 133 mbedtls_mpi A; /*!< 1. A in the equation, or 2. (A + 2) / 4 */
mbedAustin 11:cada08fc8a70 134 mbedtls_mpi B; /*!< 1. B in the equation, or 2. unused */
mbedAustin 11:cada08fc8a70 135 mbedtls_ecp_point G; /*!< generator of the (sub)group used */
mbedAustin 11:cada08fc8a70 136 mbedtls_mpi N; /*!< 1. the order of G, or 2. unused */
mbedAustin 11:cada08fc8a70 137 size_t pbits; /*!< number of bits in P */
mbedAustin 11:cada08fc8a70 138 size_t nbits; /*!< number of bits in 1. P, or 2. private keys */
mbedAustin 11:cada08fc8a70 139 unsigned int h; /*!< internal: 1 if the constants are static */
mbedAustin 11:cada08fc8a70 140 int (*modp)(mbedtls_mpi *); /*!< function for fast reduction mod P */
mbedAustin 11:cada08fc8a70 141 int (*t_pre)(mbedtls_ecp_point *, void *); /*!< unused */
mbedAustin 11:cada08fc8a70 142 int (*t_post)(mbedtls_ecp_point *, void *); /*!< unused */
mbedAustin 11:cada08fc8a70 143 void *t_data; /*!< unused */
mbedAustin 11:cada08fc8a70 144 mbedtls_ecp_point *T; /*!< pre-computed points for ecp_mul_comb() */
mbedAustin 11:cada08fc8a70 145 size_t T_size; /*!< number for pre-computed points */
mbedAustin 11:cada08fc8a70 146 }
mbedAustin 11:cada08fc8a70 147 mbedtls_ecp_group;
mbedAustin 11:cada08fc8a70 148
mbedAustin 11:cada08fc8a70 149 /**
mbedAustin 11:cada08fc8a70 150 * \brief ECP key pair structure
mbedAustin 11:cada08fc8a70 151 *
mbedAustin 11:cada08fc8a70 152 * A generic key pair that could be used for ECDSA, fixed ECDH, etc.
mbedAustin 11:cada08fc8a70 153 *
mbedAustin 11:cada08fc8a70 154 * \note Members purposefully in the same order as struc mbedtls_ecdsa_context.
mbedAustin 11:cada08fc8a70 155 */
mbedAustin 11:cada08fc8a70 156 typedef struct
mbedAustin 11:cada08fc8a70 157 {
mbedAustin 11:cada08fc8a70 158 mbedtls_ecp_group grp; /*!< Elliptic curve and base point */
mbedAustin 11:cada08fc8a70 159 mbedtls_mpi d; /*!< our secret value */
mbedAustin 11:cada08fc8a70 160 mbedtls_ecp_point Q; /*!< our public value */
mbedAustin 11:cada08fc8a70 161 }
mbedAustin 11:cada08fc8a70 162 mbedtls_ecp_keypair;
mbedAustin 11:cada08fc8a70 163
mbedAustin 11:cada08fc8a70 164 /**
mbedAustin 11:cada08fc8a70 165 * \name SECTION: Module settings
mbedAustin 11:cada08fc8a70 166 *
mbedAustin 11:cada08fc8a70 167 * The configuration options you can set for this module are in this section.
mbedAustin 11:cada08fc8a70 168 * Either change them in config.h or define them on the compiler command line.
mbedAustin 11:cada08fc8a70 169 * \{
mbedAustin 11:cada08fc8a70 170 */
mbedAustin 11:cada08fc8a70 171
mbedAustin 11:cada08fc8a70 172 #if !defined(MBEDTLS_ECP_MAX_BITS)
mbedAustin 11:cada08fc8a70 173 /**
mbedAustin 11:cada08fc8a70 174 * Maximum size of the groups (that is, of N and P)
mbedAustin 11:cada08fc8a70 175 */
mbedAustin 11:cada08fc8a70 176 #define MBEDTLS_ECP_MAX_BITS 521 /**< Maximum bit size of groups */
mbedAustin 11:cada08fc8a70 177 #endif
mbedAustin 11:cada08fc8a70 178
mbedAustin 11:cada08fc8a70 179 #define MBEDTLS_ECP_MAX_BYTES ( ( MBEDTLS_ECP_MAX_BITS + 7 ) / 8 )
mbedAustin 11:cada08fc8a70 180 #define MBEDTLS_ECP_MAX_PT_LEN ( 2 * MBEDTLS_ECP_MAX_BYTES + 1 )
mbedAustin 11:cada08fc8a70 181
mbedAustin 11:cada08fc8a70 182 #if !defined(MBEDTLS_ECP_WINDOW_SIZE)
mbedAustin 11:cada08fc8a70 183 /*
mbedAustin 11:cada08fc8a70 184 * Maximum "window" size used for point multiplication.
mbedAustin 11:cada08fc8a70 185 * Default: 6.
mbedAustin 11:cada08fc8a70 186 * Minimum value: 2. Maximum value: 7.
mbedAustin 11:cada08fc8a70 187 *
mbedAustin 11:cada08fc8a70 188 * Result is an array of at most ( 1 << ( MBEDTLS_ECP_WINDOW_SIZE - 1 ) )
mbedAustin 11:cada08fc8a70 189 * points used for point multiplication. This value is directly tied to EC
mbedAustin 11:cada08fc8a70 190 * peak memory usage, so decreasing it by one should roughly cut memory usage
mbedAustin 11:cada08fc8a70 191 * by two (if large curves are in use).
mbedAustin 11:cada08fc8a70 192 *
mbedAustin 11:cada08fc8a70 193 * Reduction in size may reduce speed, but larger curves are impacted first.
mbedAustin 11:cada08fc8a70 194 * Sample performances (in ECDHE handshakes/s, with FIXED_POINT_OPTIM = 1):
mbedAustin 11:cada08fc8a70 195 * w-size: 6 5 4 3 2
mbedAustin 11:cada08fc8a70 196 * 521 145 141 135 120 97
mbedAustin 11:cada08fc8a70 197 * 384 214 209 198 177 146
mbedAustin 11:cada08fc8a70 198 * 256 320 320 303 262 226
mbedAustin 11:cada08fc8a70 199
mbedAustin 11:cada08fc8a70 200 * 224 475 475 453 398 342
mbedAustin 11:cada08fc8a70 201 * 192 640 640 633 587 476
mbedAustin 11:cada08fc8a70 202 */
mbedAustin 11:cada08fc8a70 203 #define MBEDTLS_ECP_WINDOW_SIZE 6 /**< Maximum window size used */
mbedAustin 11:cada08fc8a70 204 #endif /* MBEDTLS_ECP_WINDOW_SIZE */
mbedAustin 11:cada08fc8a70 205
mbedAustin 11:cada08fc8a70 206 #if !defined(MBEDTLS_ECP_FIXED_POINT_OPTIM)
mbedAustin 11:cada08fc8a70 207 /*
mbedAustin 11:cada08fc8a70 208 * Trade memory for speed on fixed-point multiplication.
mbedAustin 11:cada08fc8a70 209 *
mbedAustin 11:cada08fc8a70 210 * This speeds up repeated multiplication of the generator (that is, the
mbedAustin 11:cada08fc8a70 211 * multiplication in ECDSA signatures, and half of the multiplications in
mbedAustin 11:cada08fc8a70 212 * ECDSA verification and ECDHE) by a factor roughly 3 to 4.
mbedAustin 11:cada08fc8a70 213 *
mbedAustin 11:cada08fc8a70 214 * The cost is increasing EC peak memory usage by a factor roughly 2.
mbedAustin 11:cada08fc8a70 215 *
mbedAustin 11:cada08fc8a70 216 * Change this value to 0 to reduce peak memory usage.
mbedAustin 11:cada08fc8a70 217 */
mbedAustin 11:cada08fc8a70 218 #define MBEDTLS_ECP_FIXED_POINT_OPTIM 1 /**< Enable fixed-point speed-up */
mbedAustin 11:cada08fc8a70 219 #endif /* MBEDTLS_ECP_FIXED_POINT_OPTIM */
mbedAustin 11:cada08fc8a70 220
mbedAustin 11:cada08fc8a70 221 /* \} name SECTION: Module settings */
mbedAustin 11:cada08fc8a70 222
mbedAustin 11:cada08fc8a70 223 /*
mbedAustin 11:cada08fc8a70 224 * Point formats, from RFC 4492's enum ECPointFormat
mbedAustin 11:cada08fc8a70 225 */
mbedAustin 11:cada08fc8a70 226 #define MBEDTLS_ECP_PF_UNCOMPRESSED 0 /**< Uncompressed point format */
mbedAustin 11:cada08fc8a70 227 #define MBEDTLS_ECP_PF_COMPRESSED 1 /**< Compressed point format */
mbedAustin 11:cada08fc8a70 228
mbedAustin 11:cada08fc8a70 229 /*
mbedAustin 11:cada08fc8a70 230 * Some other constants from RFC 4492
mbedAustin 11:cada08fc8a70 231 */
mbedAustin 11:cada08fc8a70 232 #define MBEDTLS_ECP_TLS_NAMED_CURVE 3 /**< ECCurveType's named_curve */
mbedAustin 11:cada08fc8a70 233
mbedAustin 11:cada08fc8a70 234 /**
mbedAustin 11:cada08fc8a70 235 * \brief Get the list of supported curves in order of preferrence
mbedAustin 11:cada08fc8a70 236 * (full information)
mbedAustin 11:cada08fc8a70 237 *
mbedAustin 11:cada08fc8a70 238 * \return A statically allocated array, the last entry is 0.
mbedAustin 11:cada08fc8a70 239 */
mbedAustin 11:cada08fc8a70 240 const mbedtls_ecp_curve_info *mbedtls_ecp_curve_list( void );
mbedAustin 11:cada08fc8a70 241
mbedAustin 11:cada08fc8a70 242 /**
mbedAustin 11:cada08fc8a70 243 * \brief Get the list of supported curves in order of preferrence
mbedAustin 11:cada08fc8a70 244 * (grp_id only)
mbedAustin 11:cada08fc8a70 245 *
mbedAustin 11:cada08fc8a70 246 * \return A statically allocated array,
mbedAustin 11:cada08fc8a70 247 * terminated with MBEDTLS_ECP_DP_NONE.
mbedAustin 11:cada08fc8a70 248 */
mbedAustin 11:cada08fc8a70 249 const mbedtls_ecp_group_id *mbedtls_ecp_grp_id_list( void );
mbedAustin 11:cada08fc8a70 250
mbedAustin 11:cada08fc8a70 251 /**
mbedAustin 11:cada08fc8a70 252 * \brief Get curve information from an internal group identifier
mbedAustin 11:cada08fc8a70 253 *
mbedAustin 11:cada08fc8a70 254 * \param grp_id A MBEDTLS_ECP_DP_XXX value
mbedAustin 11:cada08fc8a70 255 *
mbedAustin 11:cada08fc8a70 256 * \return The associated curve information or NULL
mbedAustin 11:cada08fc8a70 257 */
mbedAustin 11:cada08fc8a70 258 const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_grp_id( mbedtls_ecp_group_id grp_id );
mbedAustin 11:cada08fc8a70 259
mbedAustin 11:cada08fc8a70 260 /**
mbedAustin 11:cada08fc8a70 261 * \brief Get curve information from a TLS NamedCurve value
mbedAustin 11:cada08fc8a70 262 *
mbedAustin 11:cada08fc8a70 263 * \param tls_id A MBEDTLS_ECP_DP_XXX value
mbedAustin 11:cada08fc8a70 264 *
mbedAustin 11:cada08fc8a70 265 * \return The associated curve information or NULL
mbedAustin 11:cada08fc8a70 266 */
mbedAustin 11:cada08fc8a70 267 const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_tls_id( uint16_t tls_id );
mbedAustin 11:cada08fc8a70 268
mbedAustin 11:cada08fc8a70 269 /**
mbedAustin 11:cada08fc8a70 270 * \brief Get curve information from a human-readable name
mbedAustin 11:cada08fc8a70 271 *
mbedAustin 11:cada08fc8a70 272 * \param name The name
mbedAustin 11:cada08fc8a70 273 *
mbedAustin 11:cada08fc8a70 274 * \return The associated curve information or NULL
mbedAustin 11:cada08fc8a70 275 */
mbedAustin 11:cada08fc8a70 276 const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_name( const char *name );
mbedAustin 11:cada08fc8a70 277
mbedAustin 11:cada08fc8a70 278 /**
mbedAustin 11:cada08fc8a70 279 * \brief Initialize a point (as zero)
mbedAustin 11:cada08fc8a70 280 */
mbedAustin 11:cada08fc8a70 281 void mbedtls_ecp_point_init( mbedtls_ecp_point *pt );
mbedAustin 11:cada08fc8a70 282
mbedAustin 11:cada08fc8a70 283 /**
mbedAustin 11:cada08fc8a70 284 * \brief Initialize a group (to something meaningless)
mbedAustin 11:cada08fc8a70 285 */
mbedAustin 11:cada08fc8a70 286 void mbedtls_ecp_group_init( mbedtls_ecp_group *grp );
mbedAustin 11:cada08fc8a70 287
mbedAustin 11:cada08fc8a70 288 /**
mbedAustin 11:cada08fc8a70 289 * \brief Initialize a key pair (as an invalid one)
mbedAustin 11:cada08fc8a70 290 */
mbedAustin 11:cada08fc8a70 291 void mbedtls_ecp_keypair_init( mbedtls_ecp_keypair *key );
mbedAustin 11:cada08fc8a70 292
mbedAustin 11:cada08fc8a70 293 /**
mbedAustin 11:cada08fc8a70 294 * \brief Free the components of a point
mbedAustin 11:cada08fc8a70 295 */
mbedAustin 11:cada08fc8a70 296 void mbedtls_ecp_point_free( mbedtls_ecp_point *pt );
mbedAustin 11:cada08fc8a70 297
mbedAustin 11:cada08fc8a70 298 /**
mbedAustin 11:cada08fc8a70 299 * \brief Free the components of an ECP group
mbedAustin 11:cada08fc8a70 300 */
mbedAustin 11:cada08fc8a70 301 void mbedtls_ecp_group_free( mbedtls_ecp_group *grp );
mbedAustin 11:cada08fc8a70 302
mbedAustin 11:cada08fc8a70 303 /**
mbedAustin 11:cada08fc8a70 304 * \brief Free the components of a key pair
mbedAustin 11:cada08fc8a70 305 */
mbedAustin 11:cada08fc8a70 306 void mbedtls_ecp_keypair_free( mbedtls_ecp_keypair *key );
mbedAustin 11:cada08fc8a70 307
mbedAustin 11:cada08fc8a70 308 /**
mbedAustin 11:cada08fc8a70 309 * \brief Copy the contents of point Q into P
mbedAustin 11:cada08fc8a70 310 *
mbedAustin 11:cada08fc8a70 311 * \param P Destination point
mbedAustin 11:cada08fc8a70 312 * \param Q Source point
mbedAustin 11:cada08fc8a70 313 *
mbedAustin 11:cada08fc8a70 314 * \return 0 if successful,
mbedAustin 11:cada08fc8a70 315 * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed
mbedAustin 11:cada08fc8a70 316 */
mbedAustin 11:cada08fc8a70 317 int mbedtls_ecp_copy( mbedtls_ecp_point *P, const mbedtls_ecp_point *Q );
mbedAustin 11:cada08fc8a70 318
mbedAustin 11:cada08fc8a70 319 /**
mbedAustin 11:cada08fc8a70 320 * \brief Copy the contents of a group object
mbedAustin 11:cada08fc8a70 321 *
mbedAustin 11:cada08fc8a70 322 * \param dst Destination group
mbedAustin 11:cada08fc8a70 323 * \param src Source group
mbedAustin 11:cada08fc8a70 324 *
mbedAustin 11:cada08fc8a70 325 * \return 0 if successful,
mbedAustin 11:cada08fc8a70 326 * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed
mbedAustin 11:cada08fc8a70 327 */
mbedAustin 11:cada08fc8a70 328 int mbedtls_ecp_group_copy( mbedtls_ecp_group *dst, const mbedtls_ecp_group *src );
mbedAustin 11:cada08fc8a70 329
mbedAustin 11:cada08fc8a70 330 /**
mbedAustin 11:cada08fc8a70 331 * \brief Set a point to zero
mbedAustin 11:cada08fc8a70 332 *
mbedAustin 11:cada08fc8a70 333 * \param pt Destination point
mbedAustin 11:cada08fc8a70 334 *
mbedAustin 11:cada08fc8a70 335 * \return 0 if successful,
mbedAustin 11:cada08fc8a70 336 * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed
mbedAustin 11:cada08fc8a70 337 */
mbedAustin 11:cada08fc8a70 338 int mbedtls_ecp_set_zero( mbedtls_ecp_point *pt );
mbedAustin 11:cada08fc8a70 339
mbedAustin 11:cada08fc8a70 340 /**
mbedAustin 11:cada08fc8a70 341 * \brief Tell if a point is zero
mbedAustin 11:cada08fc8a70 342 *
mbedAustin 11:cada08fc8a70 343 * \param pt Point to test
mbedAustin 11:cada08fc8a70 344 *
mbedAustin 11:cada08fc8a70 345 * \return 1 if point is zero, 0 otherwise
mbedAustin 11:cada08fc8a70 346 */
mbedAustin 11:cada08fc8a70 347 int mbedtls_ecp_is_zero( mbedtls_ecp_point *pt );
mbedAustin 11:cada08fc8a70 348
mbedAustin 11:cada08fc8a70 349 /**
mbedAustin 11:cada08fc8a70 350 * \brief Compare two points
mbedAustin 11:cada08fc8a70 351 *
mbedAustin 11:cada08fc8a70 352 * \note This assumes the points are normalized. Otherwise,
mbedAustin 11:cada08fc8a70 353 * they may compare as "not equal" even if they are.
mbedAustin 11:cada08fc8a70 354 *
mbedAustin 11:cada08fc8a70 355 * \param P First point to compare
mbedAustin 11:cada08fc8a70 356 * \param Q Second point to compare
mbedAustin 11:cada08fc8a70 357 *
mbedAustin 11:cada08fc8a70 358 * \return 0 if the points are equal,
mbedAustin 11:cada08fc8a70 359 * MBEDTLS_ERR_ECP_BAD_INPUT_DATA otherwise
mbedAustin 11:cada08fc8a70 360 */
mbedAustin 11:cada08fc8a70 361 int mbedtls_ecp_point_cmp( const mbedtls_ecp_point *P,
mbedAustin 11:cada08fc8a70 362 const mbedtls_ecp_point *Q );
mbedAustin 11:cada08fc8a70 363
mbedAustin 11:cada08fc8a70 364 /**
mbedAustin 11:cada08fc8a70 365 * \brief Import a non-zero point from two ASCII strings
mbedAustin 11:cada08fc8a70 366 *
mbedAustin 11:cada08fc8a70 367 * \param P Destination point
mbedAustin 11:cada08fc8a70 368 * \param radix Input numeric base
mbedAustin 11:cada08fc8a70 369 * \param x First affine coordinate as a null-terminated string
mbedAustin 11:cada08fc8a70 370 * \param y Second affine coordinate as a null-terminated string
mbedAustin 11:cada08fc8a70 371 *
mbedAustin 11:cada08fc8a70 372 * \return 0 if successful, or a MBEDTLS_ERR_MPI_XXX error code
mbedAustin 11:cada08fc8a70 373 */
mbedAustin 11:cada08fc8a70 374 int mbedtls_ecp_point_read_string( mbedtls_ecp_point *P, int radix,
mbedAustin 11:cada08fc8a70 375 const char *x, const char *y );
mbedAustin 11:cada08fc8a70 376
mbedAustin 11:cada08fc8a70 377 /**
mbedAustin 11:cada08fc8a70 378 * \brief Export a point into unsigned binary data
mbedAustin 11:cada08fc8a70 379 *
mbedAustin 11:cada08fc8a70 380 * \param grp Group to which the point should belong
mbedAustin 11:cada08fc8a70 381 * \param P Point to export
mbedAustin 11:cada08fc8a70 382 * \param format Point format, should be a MBEDTLS_ECP_PF_XXX macro
mbedAustin 11:cada08fc8a70 383 * \param olen Length of the actual output
mbedAustin 11:cada08fc8a70 384 * \param buf Output buffer
mbedAustin 11:cada08fc8a70 385 * \param buflen Length of the output buffer
mbedAustin 11:cada08fc8a70 386 *
mbedAustin 11:cada08fc8a70 387 * \return 0 if successful,
mbedAustin 11:cada08fc8a70 388 * or MBEDTLS_ERR_ECP_BAD_INPUT_DATA
mbedAustin 11:cada08fc8a70 389 * or MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL
mbedAustin 11:cada08fc8a70 390 */
mbedAustin 11:cada08fc8a70 391 int mbedtls_ecp_point_write_binary( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *P,
mbedAustin 11:cada08fc8a70 392 int format, size_t *olen,
mbedAustin 11:cada08fc8a70 393 unsigned char *buf, size_t buflen );
mbedAustin 11:cada08fc8a70 394
mbedAustin 11:cada08fc8a70 395 /**
mbedAustin 11:cada08fc8a70 396 * \brief Import a point from unsigned binary data
mbedAustin 11:cada08fc8a70 397 *
mbedAustin 11:cada08fc8a70 398 * \param grp Group to which the point should belong
mbedAustin 11:cada08fc8a70 399 * \param P Point to import
mbedAustin 11:cada08fc8a70 400 * \param buf Input buffer
mbedAustin 11:cada08fc8a70 401 * \param ilen Actual length of input
mbedAustin 11:cada08fc8a70 402 *
mbedAustin 11:cada08fc8a70 403 * \return 0 if successful,
mbedAustin 11:cada08fc8a70 404 * MBEDTLS_ERR_ECP_BAD_INPUT_DATA if input is invalid,
mbedAustin 11:cada08fc8a70 405 * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed,
mbedAustin 11:cada08fc8a70 406 * MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE if the point format
mbedAustin 11:cada08fc8a70 407 * is not implemented.
mbedAustin 11:cada08fc8a70 408 *
mbedAustin 11:cada08fc8a70 409 * \note This function does NOT check that the point actually
mbedAustin 11:cada08fc8a70 410 * belongs to the given group, see mbedtls_ecp_check_pubkey() for
mbedAustin 11:cada08fc8a70 411 * that.
mbedAustin 11:cada08fc8a70 412 */
mbedAustin 11:cada08fc8a70 413 int mbedtls_ecp_point_read_binary( const mbedtls_ecp_group *grp, mbedtls_ecp_point *P,
mbedAustin 11:cada08fc8a70 414 const unsigned char *buf, size_t ilen );
mbedAustin 11:cada08fc8a70 415
mbedAustin 11:cada08fc8a70 416 /**
mbedAustin 11:cada08fc8a70 417 * \brief Import a point from a TLS ECPoint record
mbedAustin 11:cada08fc8a70 418 *
mbedAustin 11:cada08fc8a70 419 * \param grp ECP group used
mbedAustin 11:cada08fc8a70 420 * \param pt Destination point
mbedAustin 11:cada08fc8a70 421 * \param buf $(Start of input buffer)
mbedAustin 11:cada08fc8a70 422 * \param len Buffer length
mbedAustin 11:cada08fc8a70 423 *
mbedAustin 11:cada08fc8a70 424 * \note buf is updated to point right after the ECPoint on exit
mbedAustin 11:cada08fc8a70 425 *
mbedAustin 11:cada08fc8a70 426 * \return 0 if successful,
mbedAustin 11:cada08fc8a70 427 * MBEDTLS_ERR_MPI_XXX if initialization failed
mbedAustin 11:cada08fc8a70 428 * MBEDTLS_ERR_ECP_BAD_INPUT_DATA if input is invalid
mbedAustin 11:cada08fc8a70 429 */
mbedAustin 11:cada08fc8a70 430 int mbedtls_ecp_tls_read_point( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt,
mbedAustin 11:cada08fc8a70 431 const unsigned char **buf, size_t len );
mbedAustin 11:cada08fc8a70 432
mbedAustin 11:cada08fc8a70 433 /**
mbedAustin 11:cada08fc8a70 434 * \brief Export a point as a TLS ECPoint record
mbedAustin 11:cada08fc8a70 435 *
mbedAustin 11:cada08fc8a70 436 * \param grp ECP group used
mbedAustin 11:cada08fc8a70 437 * \param pt Point to export
mbedAustin 11:cada08fc8a70 438 * \param format Export format
mbedAustin 11:cada08fc8a70 439 * \param olen length of data written
mbedAustin 11:cada08fc8a70 440 * \param buf Buffer to write to
mbedAustin 11:cada08fc8a70 441 * \param blen Buffer length
mbedAustin 11:cada08fc8a70 442 *
mbedAustin 11:cada08fc8a70 443 * \return 0 if successful,
mbedAustin 11:cada08fc8a70 444 * or MBEDTLS_ERR_ECP_BAD_INPUT_DATA
mbedAustin 11:cada08fc8a70 445 * or MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL
mbedAustin 11:cada08fc8a70 446 */
mbedAustin 11:cada08fc8a70 447 int mbedtls_ecp_tls_write_point( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt,
mbedAustin 11:cada08fc8a70 448 int format, size_t *olen,
mbedAustin 11:cada08fc8a70 449 unsigned char *buf, size_t blen );
mbedAustin 11:cada08fc8a70 450
mbedAustin 11:cada08fc8a70 451 /**
mbedAustin 11:cada08fc8a70 452 * \brief Set a group using well-known domain parameters
mbedAustin 11:cada08fc8a70 453 *
mbedAustin 11:cada08fc8a70 454 * \param grp Destination group
mbedAustin 11:cada08fc8a70 455 * \param index Index in the list of well-known domain parameters
mbedAustin 11:cada08fc8a70 456 *
mbedAustin 11:cada08fc8a70 457 * \return 0 if successful,
mbedAustin 11:cada08fc8a70 458 * MBEDTLS_ERR_MPI_XXX if initialization failed
mbedAustin 11:cada08fc8a70 459 * MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE for unkownn groups
mbedAustin 11:cada08fc8a70 460 *
mbedAustin 11:cada08fc8a70 461 * \note Index should be a value of RFC 4492's enum NamedCurve,
mbedAustin 11:cada08fc8a70 462 * usually in the form of a MBEDTLS_ECP_DP_XXX macro.
mbedAustin 11:cada08fc8a70 463 */
mbedAustin 11:cada08fc8a70 464 int mbedtls_ecp_group_load( mbedtls_ecp_group *grp, mbedtls_ecp_group_id index );
mbedAustin 11:cada08fc8a70 465
mbedAustin 11:cada08fc8a70 466 /**
mbedAustin 11:cada08fc8a70 467 * \brief Set a group from a TLS ECParameters record
mbedAustin 11:cada08fc8a70 468 *
mbedAustin 11:cada08fc8a70 469 * \param grp Destination group
mbedAustin 11:cada08fc8a70 470 * \param buf &(Start of input buffer)
mbedAustin 11:cada08fc8a70 471 * \param len Buffer length
mbedAustin 11:cada08fc8a70 472 *
mbedAustin 11:cada08fc8a70 473 * \note buf is updated to point right after ECParameters on exit
mbedAustin 11:cada08fc8a70 474 *
mbedAustin 11:cada08fc8a70 475 * \return 0 if successful,
mbedAustin 11:cada08fc8a70 476 * MBEDTLS_ERR_MPI_XXX if initialization failed
mbedAustin 11:cada08fc8a70 477 * MBEDTLS_ERR_ECP_BAD_INPUT_DATA if input is invalid
mbedAustin 11:cada08fc8a70 478 */
mbedAustin 11:cada08fc8a70 479 int mbedtls_ecp_tls_read_group( mbedtls_ecp_group *grp, const unsigned char **buf, size_t len );
mbedAustin 11:cada08fc8a70 480
mbedAustin 11:cada08fc8a70 481 /**
mbedAustin 11:cada08fc8a70 482 * \brief Write the TLS ECParameters record for a group
mbedAustin 11:cada08fc8a70 483 *
mbedAustin 11:cada08fc8a70 484 * \param grp ECP group used
mbedAustin 11:cada08fc8a70 485 * \param olen Number of bytes actually written
mbedAustin 11:cada08fc8a70 486 * \param buf Buffer to write to
mbedAustin 11:cada08fc8a70 487 * \param blen Buffer length
mbedAustin 11:cada08fc8a70 488 *
mbedAustin 11:cada08fc8a70 489 * \return 0 if successful,
mbedAustin 11:cada08fc8a70 490 * or MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL
mbedAustin 11:cada08fc8a70 491 */
mbedAustin 11:cada08fc8a70 492 int mbedtls_ecp_tls_write_group( const mbedtls_ecp_group *grp, size_t *olen,
mbedAustin 11:cada08fc8a70 493 unsigned char *buf, size_t blen );
mbedAustin 11:cada08fc8a70 494
mbedAustin 11:cada08fc8a70 495 /**
mbedAustin 11:cada08fc8a70 496 * \brief Multiplication by an integer: R = m * P
mbedAustin 11:cada08fc8a70 497 * (Not thread-safe to use same group in multiple threads)
mbedAustin 11:cada08fc8a70 498 *
mbedAustin 11:cada08fc8a70 499 * \note In order to prevent timing attacks, this function
mbedAustin 11:cada08fc8a70 500 * executes the exact same sequence of (base field)
mbedAustin 11:cada08fc8a70 501 * operations for any valid m. It avoids any if-branch or
mbedAustin 11:cada08fc8a70 502 * array index depending on the value of m.
mbedAustin 11:cada08fc8a70 503 *
mbedAustin 11:cada08fc8a70 504 * \note If f_rng is not NULL, it is used to randomize intermediate
mbedAustin 11:cada08fc8a70 505 * results in order to prevent potential timing attacks
mbedAustin 11:cada08fc8a70 506 * targeting these results. It is recommended to always
mbedAustin 11:cada08fc8a70 507 * provide a non-NULL f_rng (the overhead is negligible).
mbedAustin 11:cada08fc8a70 508 *
mbedAustin 11:cada08fc8a70 509 * \param grp ECP group
mbedAustin 11:cada08fc8a70 510 * \param R Destination point
mbedAustin 11:cada08fc8a70 511 * \param m Integer by which to multiply
mbedAustin 11:cada08fc8a70 512 * \param P Point to multiply
mbedAustin 11:cada08fc8a70 513 * \param f_rng RNG function (see notes)
mbedAustin 11:cada08fc8a70 514 * \param p_rng RNG parameter
mbedAustin 11:cada08fc8a70 515 *
mbedAustin 11:cada08fc8a70 516 * \return 0 if successful,
mbedAustin 11:cada08fc8a70 517 * MBEDTLS_ERR_ECP_INVALID_KEY if m is not a valid privkey
mbedAustin 11:cada08fc8a70 518 * or P is not a valid pubkey,
mbedAustin 11:cada08fc8a70 519 * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed
mbedAustin 11:cada08fc8a70 520 */
mbedAustin 11:cada08fc8a70 521 int mbedtls_ecp_mul( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
mbedAustin 11:cada08fc8a70 522 const mbedtls_mpi *m, const mbedtls_ecp_point *P,
mbedAustin 11:cada08fc8a70 523 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
mbedAustin 11:cada08fc8a70 524
mbedAustin 11:cada08fc8a70 525 /**
mbedAustin 11:cada08fc8a70 526 * \brief Multiplication and addition of two points by integers:
mbedAustin 11:cada08fc8a70 527 * R = m * P + n * Q
mbedAustin 11:cada08fc8a70 528 * (Not thread-safe to use same group in multiple threads)
mbedAustin 11:cada08fc8a70 529 *
mbedAustin 11:cada08fc8a70 530 * \note In contrast to mbedtls_ecp_mul(), this function does not guarantee
mbedAustin 11:cada08fc8a70 531 * a constant execution flow and timing.
mbedAustin 11:cada08fc8a70 532 *
mbedAustin 11:cada08fc8a70 533 * \param grp ECP group
mbedAustin 11:cada08fc8a70 534 * \param R Destination point
mbedAustin 11:cada08fc8a70 535 * \param m Integer by which to multiply P
mbedAustin 11:cada08fc8a70 536 * \param P Point to multiply by m
mbedAustin 11:cada08fc8a70 537 * \param n Integer by which to multiply Q
mbedAustin 11:cada08fc8a70 538 * \param Q Point to be multiplied by n
mbedAustin 11:cada08fc8a70 539 *
mbedAustin 11:cada08fc8a70 540 * \return 0 if successful,
mbedAustin 11:cada08fc8a70 541 * MBEDTLS_ERR_ECP_INVALID_KEY if m or n is not a valid privkey
mbedAustin 11:cada08fc8a70 542 * or P or Q is not a valid pubkey,
mbedAustin 11:cada08fc8a70 543 * MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed
mbedAustin 11:cada08fc8a70 544 */
mbedAustin 11:cada08fc8a70 545 int mbedtls_ecp_muladd( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
mbedAustin 11:cada08fc8a70 546 const mbedtls_mpi *m, const mbedtls_ecp_point *P,
mbedAustin 11:cada08fc8a70 547 const mbedtls_mpi *n, const mbedtls_ecp_point *Q );
mbedAustin 11:cada08fc8a70 548
mbedAustin 11:cada08fc8a70 549 /**
mbedAustin 11:cada08fc8a70 550 * \brief Check that a point is a valid public key on this curve
mbedAustin 11:cada08fc8a70 551 *
mbedAustin 11:cada08fc8a70 552 * \param grp Curve/group the point should belong to
mbedAustin 11:cada08fc8a70 553 * \param pt Point to check
mbedAustin 11:cada08fc8a70 554 *
mbedAustin 11:cada08fc8a70 555 * \return 0 if point is a valid public key,
mbedAustin 11:cada08fc8a70 556 * MBEDTLS_ERR_ECP_INVALID_KEY otherwise.
mbedAustin 11:cada08fc8a70 557 *
mbedAustin 11:cada08fc8a70 558 * \note This function only checks the point is non-zero, has valid
mbedAustin 11:cada08fc8a70 559 * coordinates and lies on the curve, but not that it is
mbedAustin 11:cada08fc8a70 560 * indeed a multiple of G. This is additional check is more
mbedAustin 11:cada08fc8a70 561 * expensive, isn't required by standards, and shouldn't be
mbedAustin 11:cada08fc8a70 562 * necessary if the group used has a small cofactor. In
mbedAustin 11:cada08fc8a70 563 * particular, it is useless for the NIST groups which all
mbedAustin 11:cada08fc8a70 564 * have a cofactor of 1.
mbedAustin 11:cada08fc8a70 565 *
mbedAustin 11:cada08fc8a70 566 * \note Uses bare components rather than an mbedtls_ecp_keypair structure
mbedAustin 11:cada08fc8a70 567 * in order to ease use with other structures such as
mbedAustin 11:cada08fc8a70 568 * mbedtls_ecdh_context of mbedtls_ecdsa_context.
mbedAustin 11:cada08fc8a70 569 */
mbedAustin 11:cada08fc8a70 570 int mbedtls_ecp_check_pubkey( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt );
mbedAustin 11:cada08fc8a70 571
mbedAustin 11:cada08fc8a70 572 /**
mbedAustin 11:cada08fc8a70 573 * \brief Check that an mbedtls_mpi is a valid private key for this curve
mbedAustin 11:cada08fc8a70 574 *
mbedAustin 11:cada08fc8a70 575 * \param grp Group used
mbedAustin 11:cada08fc8a70 576 * \param d Integer to check
mbedAustin 11:cada08fc8a70 577 *
mbedAustin 11:cada08fc8a70 578 * \return 0 if point is a valid private key,
mbedAustin 11:cada08fc8a70 579 * MBEDTLS_ERR_ECP_INVALID_KEY otherwise.
mbedAustin 11:cada08fc8a70 580 *
mbedAustin 11:cada08fc8a70 581 * \note Uses bare components rather than an mbedtls_ecp_keypair structure
mbedAustin 11:cada08fc8a70 582 * in order to ease use with other structures such as
mbedAustin 11:cada08fc8a70 583 * mbedtls_ecdh_context of mbedtls_ecdsa_context.
mbedAustin 11:cada08fc8a70 584 */
mbedAustin 11:cada08fc8a70 585 int mbedtls_ecp_check_privkey( const mbedtls_ecp_group *grp, const mbedtls_mpi *d );
mbedAustin 11:cada08fc8a70 586
mbedAustin 11:cada08fc8a70 587 /**
mbedAustin 11:cada08fc8a70 588 * \brief Generate a keypair with configurable base point
mbedAustin 11:cada08fc8a70 589 *
mbedAustin 11:cada08fc8a70 590 * \param grp ECP group
mbedAustin 11:cada08fc8a70 591 * \param G Chosen base point
mbedAustin 11:cada08fc8a70 592 * \param d Destination MPI (secret part)
mbedAustin 11:cada08fc8a70 593 * \param Q Destination point (public part)
mbedAustin 11:cada08fc8a70 594 * \param f_rng RNG function
mbedAustin 11:cada08fc8a70 595 * \param p_rng RNG parameter
mbedAustin 11:cada08fc8a70 596 *
mbedAustin 11:cada08fc8a70 597 * \return 0 if successful,
mbedAustin 11:cada08fc8a70 598 * or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code
mbedAustin 11:cada08fc8a70 599 *
mbedAustin 11:cada08fc8a70 600 * \note Uses bare components rather than an mbedtls_ecp_keypair structure
mbedAustin 11:cada08fc8a70 601 * in order to ease use with other structures such as
mbedAustin 11:cada08fc8a70 602 * mbedtls_ecdh_context of mbedtls_ecdsa_context.
mbedAustin 11:cada08fc8a70 603 */
mbedAustin 11:cada08fc8a70 604 int mbedtls_ecp_gen_keypair_base( mbedtls_ecp_group *grp,
mbedAustin 11:cada08fc8a70 605 const mbedtls_ecp_point *G,
mbedAustin 11:cada08fc8a70 606 mbedtls_mpi *d, mbedtls_ecp_point *Q,
mbedAustin 11:cada08fc8a70 607 int (*f_rng)(void *, unsigned char *, size_t),
mbedAustin 11:cada08fc8a70 608 void *p_rng );
mbedAustin 11:cada08fc8a70 609
mbedAustin 11:cada08fc8a70 610 /**
mbedAustin 11:cada08fc8a70 611 * \brief Generate a keypair
mbedAustin 11:cada08fc8a70 612 *
mbedAustin 11:cada08fc8a70 613 * \param grp ECP group
mbedAustin 11:cada08fc8a70 614 * \param d Destination MPI (secret part)
mbedAustin 11:cada08fc8a70 615 * \param Q Destination point (public part)
mbedAustin 11:cada08fc8a70 616 * \param f_rng RNG function
mbedAustin 11:cada08fc8a70 617 * \param p_rng RNG parameter
mbedAustin 11:cada08fc8a70 618 *
mbedAustin 11:cada08fc8a70 619 * \return 0 if successful,
mbedAustin 11:cada08fc8a70 620 * or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code
mbedAustin 11:cada08fc8a70 621 *
mbedAustin 11:cada08fc8a70 622 * \note Uses bare components rather than an mbedtls_ecp_keypair structure
mbedAustin 11:cada08fc8a70 623 * in order to ease use with other structures such as
mbedAustin 11:cada08fc8a70 624 * mbedtls_ecdh_context of mbedtls_ecdsa_context.
mbedAustin 11:cada08fc8a70 625 */
mbedAustin 11:cada08fc8a70 626 int mbedtls_ecp_gen_keypair( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q,
mbedAustin 11:cada08fc8a70 627 int (*f_rng)(void *, unsigned char *, size_t),
mbedAustin 11:cada08fc8a70 628 void *p_rng );
mbedAustin 11:cada08fc8a70 629
mbedAustin 11:cada08fc8a70 630 /**
mbedAustin 11:cada08fc8a70 631 * \brief Generate a keypair
mbedAustin 11:cada08fc8a70 632 *
mbedAustin 11:cada08fc8a70 633 * \param grp_id ECP group identifier
mbedAustin 11:cada08fc8a70 634 * \param key Destination keypair
mbedAustin 11:cada08fc8a70 635 * \param f_rng RNG function
mbedAustin 11:cada08fc8a70 636 * \param p_rng RNG parameter
mbedAustin 11:cada08fc8a70 637 *
mbedAustin 11:cada08fc8a70 638 * \return 0 if successful,
mbedAustin 11:cada08fc8a70 639 * or a MBEDTLS_ERR_ECP_XXX or MBEDTLS_MPI_XXX error code
mbedAustin 11:cada08fc8a70 640 */
mbedAustin 11:cada08fc8a70 641 int mbedtls_ecp_gen_key( mbedtls_ecp_group_id grp_id, mbedtls_ecp_keypair *key,
mbedAustin 11:cada08fc8a70 642 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
mbedAustin 11:cada08fc8a70 643
mbedAustin 11:cada08fc8a70 644 /**
mbedAustin 11:cada08fc8a70 645 * \brief Check a public-private key pair
mbedAustin 11:cada08fc8a70 646 *
mbedAustin 11:cada08fc8a70 647 * \param pub Keypair structure holding a public key
mbedAustin 11:cada08fc8a70 648 * \param prv Keypair structure holding a private (plus public) key
mbedAustin 11:cada08fc8a70 649 *
mbedAustin 11:cada08fc8a70 650 * \return 0 if successful (keys are valid and match), or
mbedAustin 11:cada08fc8a70 651 * MBEDTLS_ERR_ECP_BAD_INPUT_DATA, or
mbedAustin 11:cada08fc8a70 652 * a MBEDTLS_ERR_ECP_XXX or MBEDTLS_ERR_MPI_XXX code.
mbedAustin 11:cada08fc8a70 653 */
mbedAustin 11:cada08fc8a70 654 int mbedtls_ecp_check_pub_priv( const mbedtls_ecp_keypair *pub, const mbedtls_ecp_keypair *prv );
mbedAustin 11:cada08fc8a70 655
mbedAustin 11:cada08fc8a70 656 #if defined(MBEDTLS_SELF_TEST)
mbedAustin 11:cada08fc8a70 657 /**
mbedAustin 11:cada08fc8a70 658 * \brief Checkup routine
mbedAustin 11:cada08fc8a70 659 *
mbedAustin 11:cada08fc8a70 660 * \return 0 if successful, or 1 if a test failed
mbedAustin 11:cada08fc8a70 661 */
mbedAustin 11:cada08fc8a70 662 int mbedtls_ecp_self_test( int verbose );
mbedAustin 11:cada08fc8a70 663 #endif
mbedAustin 11:cada08fc8a70 664
mbedAustin 11:cada08fc8a70 665 #ifdef __cplusplus
mbedAustin 11:cada08fc8a70 666 }
mbedAustin 11:cada08fc8a70 667 #endif
mbedAustin 11:cada08fc8a70 668
mbedAustin 11:cada08fc8a70 669 #endif /* ecp.h */