Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
ecp.h
00001 /** 00002 * \file ecp.h 00003 * 00004 * \brief Elliptic curves over GF(p) 00005 * 00006 * Copyright (C) 2006-2013, Brainspark B.V. 00007 * 00008 * This file is part of PolarSSL (http://www.polarssl.org) 00009 * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org> 00010 * 00011 * All rights reserved. 00012 * 00013 * This program is free software; you can redistribute it and/or modify 00014 * it under the terms of the GNU General Public License as published by 00015 * the Free Software Foundation; either version 2 of the License, or 00016 * (at your option) any later version. 00017 * 00018 * This program is distributed in the hope that it will be useful, 00019 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00020 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00021 * GNU General Public License for more details. 00022 * 00023 * You should have received a copy of the GNU General Public License along 00024 * with this program; if not, write to the Free Software Foundation, Inc., 00025 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 00026 */ 00027 #ifndef POLARSSL_ECP_H 00028 #define POLARSSL_ECP_H 00029 00030 #include "bignum.h" 00031 00032 /* 00033 * ECP error codes 00034 */ 00035 #define POLARSSL_ERR_ECP_BAD_INPUT_DATA -0x4F80 /**< Bad input parameters to function. */ 00036 #define POLARSSL_ERR_ECP_BUFFER_TOO_SMALL -0x4F00 /**< The buffer is too small to write to. */ 00037 #define POLARSSL_ERR_ECP_FEATURE_UNAVAILABLE -0x4E80 /**< Requested curve not available. */ 00038 #define POLARSSL_ERR_ECP_VERIFY_FAILED -0x4E00 /**< The signature is not valid. */ 00039 #define POLARSSL_ERR_ECP_MALLOC_FAILED -0x4D80 /**< Memory allocation failed. */ 00040 #define POLARSSL_ERR_ECP_RANDOM_FAILED -0x4D00 /**< Generation of random value, such as (ephemeral) key, failed. */ 00041 #define POLARSSL_ERR_ECP_INVALID_KEY -0x4C80 /**< Invalid private or public key. */ 00042 #define POLARSSL_ERR_ECP_SIG_LEN_MISMATCH -0x4C00 /**< Signature is valid but shorter than the user-supplied length. */ 00043 00044 #ifdef __cplusplus 00045 extern "C" { 00046 #endif 00047 00048 /** 00049 * Domain parameters (curve, subgroup and generator) identifiers. 00050 * 00051 * Only curves over prime fields are supported. 00052 * 00053 * \warning This library does not support validation of arbitrary domain 00054 * parameters. Therefore, only well-known domain parameters from trusted 00055 * sources should be used. See ecp_use_known_dp(). 00056 */ 00057 typedef enum 00058 { 00059 POLARSSL_ECP_DP_NONE = 0, 00060 POLARSSL_ECP_DP_SECP192R1 , /*!< 192-bits NIST curve */ 00061 POLARSSL_ECP_DP_SECP224R1 , /*!< 224-bits NIST curve */ 00062 POLARSSL_ECP_DP_SECP256R1 , /*!< 256-bits NIST curve */ 00063 POLARSSL_ECP_DP_SECP384R1 , /*!< 384-bits NIST curve */ 00064 POLARSSL_ECP_DP_SECP521R1 , /*!< 521-bits NIST curve */ 00065 POLARSSL_ECP_DP_BP256R1 , /*!< 256-bits Brainpool curve */ 00066 POLARSSL_ECP_DP_BP384R1 , /*!< 384-bits Brainpool curve */ 00067 POLARSSL_ECP_DP_BP512R1 , /*!< 512-bits Brainpool curve */ 00068 POLARSSL_ECP_DP_M221 , /*!< (not implemented yet) */ 00069 POLARSSL_ECP_DP_M255 , /*!< Curve25519 */ 00070 POLARSSL_ECP_DP_M383 , /*!< (not implemented yet) */ 00071 POLARSSL_ECP_DP_M511 , /*!< (not implemented yet) */ 00072 POLARSSL_ECP_DP_SECP192K1 , /*!< 192-bits "Koblitz" curve */ 00073 POLARSSL_ECP_DP_SECP224K1 , /*!< 224-bits "Koblitz" curve */ 00074 POLARSSL_ECP_DP_SECP256K1 , /*!< 256-bits "Koblitz" curve */ 00075 } ecp_group_id; 00076 00077 /** 00078 * Number of supported curves (plus one for NONE). 00079 * 00080 * (Montgomery curves excluded for now.) 00081 */ 00082 #define POLARSSL_ECP_DP_MAX 12 00083 00084 /** 00085 * Curve information for use by other modules 00086 */ 00087 typedef struct 00088 { 00089 ecp_group_id grp_id ; /*!< Internal identifier */ 00090 uint16_t tls_id ; /*!< TLS NamedCurve identifier */ 00091 uint16_t size ; /*!< Curve size in bits */ 00092 const char *name ; /*!< Human-friendly name */ 00093 } ecp_curve_info; 00094 00095 /** 00096 * \brief ECP point structure (jacobian coordinates) 00097 * 00098 * \note All functions expect and return points satisfying 00099 * the following condition: Z == 0 or Z == 1. (Other 00100 * values of Z are used by internal functions only.) 00101 * The point is zero, or "at infinity", if Z == 0. 00102 * Otherwise, X and Y are its standard (affine) coordinates. 00103 */ 00104 typedef struct 00105 { 00106 mpi X ; /*!< the point's X coordinate */ 00107 mpi Y ; /*!< the point's Y coordinate */ 00108 mpi Z ; /*!< the point's Z coordinate */ 00109 } 00110 ecp_point; 00111 00112 /** 00113 * \brief ECP group structure 00114 * 00115 * We consider two types of curves equations: 00116 * 1. Short Weierstrass y^2 = x^3 + A x + B mod P (SEC1 + RFC 4492) 00117 * 2. Montgomery, y^2 = x^3 + A x^2 + x mod P (M255 + draft) 00118 * In both cases, a generator G for a prime-order subgroup is fixed. In the 00119 * short weierstrass, this subgroup is actually the whole curve, and its 00120 * cardinal is denoted by N. 00121 * 00122 * In the case of Short Weierstrass curves, our code requires that N is an odd 00123 * prime. (Use odd in ecp_mul() and prime in ecdsa_sign() for blinding.) 00124 * 00125 * In the case of Montgomery curves, we don't store A but (A + 2) / 4 which is 00126 * the quantity actually used in the formulas. Also, nbits is not the size of N 00127 * but the required size for private keys. 00128 * 00129 * If modp is NULL, reduction modulo P is done using a generic algorithm. 00130 * Otherwise, it must point to a function that takes an mpi in the range 00131 * 0..2^(2*pbits)-1 and transforms it in-place in an integer of little more 00132 * than pbits, so that the integer may be efficiently brought in the 0..P-1 00133 * range by a few additions or substractions. It must return 0 on success and 00134 * non-zero on failure. 00135 */ 00136 typedef struct 00137 { 00138 ecp_group_id id ; /*!< internal group identifier */ 00139 mpi P ; /*!< prime modulus of the base field */ 00140 mpi A ; /*!< 1. A in the equation, or 2. (A + 2) / 4 */ 00141 mpi B ; /*!< 1. B in the equation, or 2. unused */ 00142 ecp_point G ; /*!< generator of the (sub)group used */ 00143 mpi N ; /*!< 1. the order of G, or 2. unused */ 00144 size_t pbits ; /*!< number of bits in P */ 00145 size_t nbits ; /*!< number of bits in 1. P, or 2. private keys */ 00146 unsigned int h ; /*!< internal: 1 if the constants are static */ 00147 int (*modp)(mpi *); /*!< function for fast reduction mod P */ 00148 int (*t_pre)(ecp_point *, void *); /*!< unused */ 00149 int (*t_post)(ecp_point *, void *); /*!< unused */ 00150 void *t_data ; /*!< unused */ 00151 ecp_point *T ; /*!< pre-computed points for ecp_mul_comb() */ 00152 size_t T_size ; /*!< number for pre-computed points */ 00153 } 00154 ecp_group; 00155 00156 /** 00157 * \brief ECP key pair structure 00158 * 00159 * A generic key pair that could be used for ECDSA, fixed ECDH, etc. 00160 * 00161 * \note Members purposefully in the same order as struc ecdsa_context. 00162 */ 00163 typedef struct 00164 { 00165 ecp_group grp ; /*!< Elliptic curve and base point */ 00166 mpi d ; /*!< our secret value */ 00167 ecp_point Q ; /*!< our public value */ 00168 } 00169 ecp_keypair; 00170 00171 /** 00172 * \name SECTION: Module settings 00173 * 00174 * The configuration options you can set for this module are in this section. 00175 * Either change them in config.h or define them on the compiler command line. 00176 * \{ 00177 */ 00178 00179 #if !defined(POLARSSL_ECP_MAX_BITS) 00180 /** 00181 * Maximum size of the groups (that is, of N and P) 00182 */ 00183 #define POLARSSL_ECP_MAX_BITS 521 /**< Maximum bit size of groups */ 00184 #endif 00185 00186 #define POLARSSL_ECP_MAX_BYTES ( ( POLARSSL_ECP_MAX_BITS + 7 ) / 8 ) 00187 #define POLARSSL_ECP_MAX_PT_LEN ( 2 * POLARSSL_ECP_MAX_BYTES + 1 ) 00188 00189 #if !defined(POLARSSL_ECP_WINDOW_SIZE) 00190 /* 00191 * Maximum "window" size used for point multiplication. 00192 * Default: 6. 00193 * Minimum value: 2. Maximum value: 7. 00194 * 00195 * Result is an array of at most ( 1 << ( POLARSSL_ECP_WINDOW_SIZE - 1 ) ) 00196 * points used for point multiplication. This value is directly tied to EC 00197 * peak memory usage, so decreasing it by one should roughly cut memory usage 00198 * by two (if large curves are in use). 00199 * 00200 * Reduction in size may reduce speed, but larger curves are impacted first. 00201 * Sample performances (in ECDHE handshakes/s, with FIXED_POINT_OPTIM = 1): 00202 * w-size: 6 5 4 3 2 00203 * 521 145 141 135 120 97 00204 * 384 214 209 198 177 146 00205 * 256 320 320 303 262 226 00206 00207 * 224 475 475 453 398 342 00208 * 192 640 640 633 587 476 00209 */ 00210 #define POLARSSL_ECP_WINDOW_SIZE 6 /**< Maximum window size used */ 00211 #endif 00212 00213 #if !defined(POLARSSL_ECP_FIXED_POINT_OPTIM) 00214 /* 00215 * Trade memory for speed on fixed-point multiplication. 00216 * 00217 * This speeds up repeated multiplication of the generator (that is, the 00218 * multiplication in ECDSA signatures, and half of the multiplications in 00219 * ECDSA verification and ECDHE) by a factor roughly 3 to 4. 00220 * 00221 * The cost is increasing EC peak memory usage by a factor roughly 2. 00222 * 00223 * Change this value to 0 to reduce peak memory usage. 00224 */ 00225 #define POLARSSL_ECP_FIXED_POINT_OPTIM 1 /**< Enable fixed-point speed-up */ 00226 #endif 00227 00228 /* \} name SECTION: Module settings */ 00229 00230 /* 00231 * Point formats, from RFC 4492's enum ECPointFormat 00232 */ 00233 #define POLARSSL_ECP_PF_UNCOMPRESSED 0 /**< Uncompressed point format */ 00234 #define POLARSSL_ECP_PF_COMPRESSED 1 /**< Compressed point format */ 00235 00236 /* 00237 * Some other constants from RFC 4492 00238 */ 00239 #define POLARSSL_ECP_TLS_NAMED_CURVE 3 /**< ECCurveType's named_curve */ 00240 00241 /** 00242 * \brief Get the list of supported curves in order of preferrence 00243 * (full information) 00244 * 00245 * \return A statically allocated array, the last entry is 0. 00246 */ 00247 const ecp_curve_info *ecp_curve_list( void ); 00248 00249 /** 00250 * \brief Get the list of supported curves in order of preferrence 00251 * (grp_id only) 00252 * 00253 * \return A statically allocated array, 00254 * terminated with POLARSSL_ECP_DP_NONE. 00255 */ 00256 const ecp_group_id *ecp_grp_id_list( void ); 00257 00258 /** 00259 * \brief Get curve information from an internal group identifier 00260 * 00261 * \param grp_id A POLARSSL_ECP_DP_XXX value 00262 * 00263 * \return The associated curve information or NULL 00264 */ 00265 const ecp_curve_info *ecp_curve_info_from_grp_id( ecp_group_id grp_id ); 00266 00267 /** 00268 * \brief Get curve information from a TLS NamedCurve value 00269 * 00270 * \param tls_id A POLARSSL_ECP_DP_XXX value 00271 * 00272 * \return The associated curve information or NULL 00273 */ 00274 const ecp_curve_info *ecp_curve_info_from_tls_id( uint16_t tls_id ); 00275 00276 /** 00277 * \brief Get curve information from a human-readable name 00278 * 00279 * \param name The name 00280 * 00281 * \return The associated curve information or NULL 00282 */ 00283 const ecp_curve_info *ecp_curve_info_from_name( const char *name ); 00284 00285 /** 00286 * \brief Initialize a point (as zero) 00287 */ 00288 void ecp_point_init( ecp_point *pt ); 00289 00290 /** 00291 * \brief Initialize a group (to something meaningless) 00292 */ 00293 void ecp_group_init( ecp_group *grp ); 00294 00295 /** 00296 * \brief Initialize a key pair (as an invalid one) 00297 */ 00298 void ecp_keypair_init( ecp_keypair *key ); 00299 00300 /** 00301 * \brief Free the components of a point 00302 */ 00303 void ecp_point_free( ecp_point *pt ); 00304 00305 /** 00306 * \brief Free the components of an ECP group 00307 */ 00308 void ecp_group_free( ecp_group *grp ); 00309 00310 /** 00311 * \brief Free the components of a key pair 00312 */ 00313 void ecp_keypair_free( ecp_keypair *key ); 00314 00315 /** 00316 * \brief Copy the contents of point Q into P 00317 * 00318 * \param P Destination point 00319 * \param Q Source point 00320 * 00321 * \return 0 if successful, 00322 * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed 00323 */ 00324 int ecp_copy( ecp_point *P, const ecp_point *Q ); 00325 00326 /** 00327 * \brief Copy the contents of a group object 00328 * 00329 * \param dst Destination group 00330 * \param src Source group 00331 * 00332 * \return 0 if successful, 00333 * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed 00334 */ 00335 int ecp_group_copy( ecp_group *dst, const ecp_group *src ); 00336 00337 /** 00338 * \brief Set a point to zero 00339 * 00340 * \param pt Destination point 00341 * 00342 * \return 0 if successful, 00343 * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed 00344 */ 00345 int ecp_set_zero( ecp_point *pt ); 00346 00347 /** 00348 * \brief Tell if a point is zero 00349 * 00350 * \param pt Point to test 00351 * 00352 * \return 1 if point is zero, 0 otherwise 00353 */ 00354 int ecp_is_zero( ecp_point *pt ); 00355 00356 /** 00357 * \brief Import a non-zero point from two ASCII strings 00358 * 00359 * \param P Destination point 00360 * \param radix Input numeric base 00361 * \param x First affine coordinate as a null-terminated string 00362 * \param y Second affine coordinate as a null-terminated string 00363 * 00364 * \return 0 if successful, or a POLARSSL_ERR_MPI_XXX error code 00365 */ 00366 int ecp_point_read_string( ecp_point *P, int radix, 00367 const char *x, const char *y ); 00368 00369 /** 00370 * \brief Export a point into unsigned binary data 00371 * 00372 * \param grp Group to which the point should belong 00373 * \param P Point to export 00374 * \param format Point format, should be a POLARSSL_ECP_PF_XXX macro 00375 * \param olen Length of the actual output 00376 * \param buf Output buffer 00377 * \param buflen Length of the output buffer 00378 * 00379 * \return 0 if successful, 00380 * or POLARSSL_ERR_ECP_BAD_INPUT_DATA 00381 * or POLARSSL_ERR_ECP_BUFFER_TOO_SMALL 00382 */ 00383 int ecp_point_write_binary( const ecp_group *grp, const ecp_point *P, 00384 int format, size_t *olen, 00385 unsigned char *buf, size_t buflen ); 00386 00387 /** 00388 * \brief Import a point from unsigned binary data 00389 * 00390 * \param grp Group to which the point should belong 00391 * \param P Point to import 00392 * \param buf Input buffer 00393 * \param ilen Actual length of input 00394 * 00395 * \return 0 if successful, 00396 * POLARSSL_ERR_ECP_BAD_INPUT_DATA if input is invalid, 00397 * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed, 00398 * POLARSSL_ERR_ECP_FEATURE_UNAVAILABLE if the point format 00399 * is not implemented. 00400 * 00401 * \note This function does NOT check that the point actually 00402 * belongs to the given group, see ecp_check_pubkey() for 00403 * that. 00404 */ 00405 int ecp_point_read_binary( const ecp_group *grp, ecp_point *P, 00406 const unsigned char *buf, size_t ilen ); 00407 00408 /** 00409 * \brief Import a point from a TLS ECPoint record 00410 * 00411 * \param grp ECP group used 00412 * \param pt Destination point 00413 * \param buf $(Start of input buffer) 00414 * \param len Buffer length 00415 * 00416 * \return O if successful, 00417 * POLARSSL_ERR_MPI_XXX if initialization failed 00418 * POLARSSL_ERR_ECP_BAD_INPUT_DATA if input is invalid 00419 */ 00420 int ecp_tls_read_point( const ecp_group *grp, ecp_point *pt, 00421 const unsigned char **buf, size_t len ); 00422 00423 /** 00424 * \brief Export a point as a TLS ECPoint record 00425 * 00426 * \param grp ECP group used 00427 * \param pt Point to export 00428 * \param format Export format 00429 * \param olen length of data written 00430 * \param buf Buffer to write to 00431 * \param blen Buffer length 00432 * 00433 * \return 0 if successful, 00434 * or POLARSSL_ERR_ECP_BAD_INPUT_DATA 00435 * or POLARSSL_ERR_ECP_BUFFER_TOO_SMALL 00436 */ 00437 int ecp_tls_write_point( const ecp_group *grp, const ecp_point *pt, 00438 int format, size_t *olen, 00439 unsigned char *buf, size_t blen ); 00440 00441 /** 00442 * \brief Import an ECP group from null-terminated ASCII strings 00443 * 00444 * \param grp Destination group 00445 * \param radix Input numeric base 00446 * \param p Prime modulus of the base field 00447 * \param b Constant term in the equation 00448 * \param gx The generator's X coordinate 00449 * \param gy The generator's Y coordinate 00450 * \param n The generator's order 00451 * 00452 * \return 0 if successful, or a POLARSSL_ERR_MPI_XXX error code 00453 * 00454 * \note Sets all fields except modp. 00455 */ 00456 int ecp_group_read_string( ecp_group *grp, int radix, 00457 const char *p, const char *b, 00458 const char *gx, const char *gy, const char *n); 00459 00460 /** 00461 * \brief Set a group using well-known domain parameters 00462 * 00463 * \param grp Destination group 00464 * \param index Index in the list of well-known domain parameters 00465 * 00466 * \return O if successful, 00467 * POLARSSL_ERR_MPI_XXX if initialization failed 00468 * POLARSSL_ERR_ECP_FEATURE_UNAVAILABLE for unkownn groups 00469 * 00470 * \note Index should be a value of RFC 4492's enum NamdeCurve, 00471 * possibly in the form of a POLARSSL_ECP_DP_XXX macro. 00472 */ 00473 int ecp_use_known_dp( ecp_group *grp, ecp_group_id index ); 00474 00475 /** 00476 * \brief Set a group from a TLS ECParameters record 00477 * 00478 * \param grp Destination group 00479 * \param buf &(Start of input buffer) 00480 * \param len Buffer length 00481 * 00482 * \return O if successful, 00483 * POLARSSL_ERR_MPI_XXX if initialization failed 00484 * POLARSSL_ERR_ECP_BAD_INPUT_DATA if input is invalid 00485 */ 00486 int ecp_tls_read_group( ecp_group *grp, const unsigned char **buf, size_t len ); 00487 00488 /** 00489 * \brief Write the TLS ECParameters record for a group 00490 * 00491 * \param grp ECP group used 00492 * \param olen Number of bytes actually written 00493 * \param buf Buffer to write to 00494 * \param blen Buffer length 00495 * 00496 * \return 0 if successful, 00497 * or POLARSSL_ERR_ECP_BUFFER_TOO_SMALL 00498 */ 00499 int ecp_tls_write_group( const ecp_group *grp, size_t *olen, 00500 unsigned char *buf, size_t blen ); 00501 00502 /** 00503 * \brief Addition: R = P + Q 00504 * 00505 * \param grp ECP group 00506 * \param R Destination point 00507 * \param P Left-hand point 00508 * \param Q Right-hand point 00509 * 00510 * \return 0 if successful, 00511 * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed 00512 * 00513 * \note This function does not support Montgomery curves, such as 00514 * Curve25519. 00515 */ 00516 int ecp_add( const ecp_group *grp, ecp_point *R, 00517 const ecp_point *P, const ecp_point *Q ); 00518 00519 /** 00520 * \brief Subtraction: R = P - Q 00521 * 00522 * \param grp ECP group 00523 * \param R Destination point 00524 * \param P Left-hand point 00525 * \param Q Right-hand point 00526 * 00527 * \return 0 if successful, 00528 * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed 00529 * 00530 * \note This function does not support Montgomery curves, such as 00531 * Curve25519. 00532 */ 00533 int ecp_sub( const ecp_group *grp, ecp_point *R, 00534 const ecp_point *P, const ecp_point *Q ); 00535 00536 /** 00537 * \brief Multiplication by an integer: R = m * P 00538 * (Not thread-safe to use same group in multiple threads) 00539 * 00540 * \param grp ECP group 00541 * \param R Destination point 00542 * \param m Integer by which to multiply 00543 * \param P Point to multiply 00544 * \param f_rng RNG function (see notes) 00545 * \param p_rng RNG parameter 00546 * 00547 * \return 0 if successful, 00548 * POLARSSL_ERR_ECP_INVALID_KEY if m is not a valid privkey 00549 * or P is not a valid pubkey, 00550 * POLARSSL_ERR_MPI_MALLOC_FAILED if memory allocation failed 00551 * 00552 * \note In order to prevent timing attacks, this function 00553 * executes the exact same sequence of (base field) 00554 * operations for any valid m. It avoids any if-branch or 00555 * array index depending on the value of m. 00556 * 00557 * \note If f_rng is not NULL, it is used to randomize intermediate 00558 * results in order to prevent potential timing attacks 00559 * targeting these results. It is recommended to always 00560 * provide a non-NULL f_rng (the overhead is negligible). 00561 */ 00562 int ecp_mul( ecp_group *grp, ecp_point *R, 00563 const mpi *m, const ecp_point *P, 00564 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); 00565 00566 /** 00567 * \brief Check that a point is a valid public key on this curve 00568 * 00569 * \param grp Curve/group the point should belong to 00570 * \param pt Point to check 00571 * 00572 * \return 0 if point is a valid public key, 00573 * POLARSSL_ERR_ECP_INVALID_KEY otherwise. 00574 * 00575 * \note This function only checks the point is non-zero, has valid 00576 * coordinates and lies on the curve, but not that it is 00577 * indeed a multiple of G. This is additional check is more 00578 * expensive, isn't required by standards, and shouldn't be 00579 * necessary if the group used has a small cofactor. In 00580 * particular, it is useless for the NIST groups which all 00581 * have a cofactor of 1. 00582 * 00583 * \note Uses bare components rather than an ecp_keypair structure 00584 * in order to ease use with other structures such as 00585 * ecdh_context of ecdsa_context. 00586 */ 00587 int ecp_check_pubkey( const ecp_group *grp, const ecp_point *pt ); 00588 00589 /** 00590 * \brief Check that an mpi is a valid private key for this curve 00591 * 00592 * \param grp Group used 00593 * \param d Integer to check 00594 * 00595 * \return 0 if point is a valid private key, 00596 * POLARSSL_ERR_ECP_INVALID_KEY otherwise. 00597 * 00598 * \note Uses bare components rather than an ecp_keypair structure 00599 * in order to ease use with other structures such as 00600 * ecdh_context of ecdsa_context. 00601 */ 00602 int ecp_check_privkey( const ecp_group *grp, const mpi *d ); 00603 00604 /** 00605 * \brief Generate a keypair 00606 * 00607 * \param grp ECP group 00608 * \param d Destination MPI (secret part) 00609 * \param Q Destination point (public part) 00610 * \param f_rng RNG function 00611 * \param p_rng RNG parameter 00612 * 00613 * \return 0 if successful, 00614 * or a POLARSSL_ERR_ECP_XXX or POLARSSL_MPI_XXX error code 00615 * 00616 * \note Uses bare components rather than an ecp_keypair structure 00617 * in order to ease use with other structures such as 00618 * ecdh_context of ecdsa_context. 00619 */ 00620 int ecp_gen_keypair( ecp_group *grp, mpi *d, ecp_point *Q, 00621 int (*f_rng)(void *, unsigned char *, size_t), 00622 void *p_rng ); 00623 00624 /** 00625 * \brief Generate a keypair 00626 * 00627 * \param grp_id ECP group identifier 00628 * \param key Destination keypair 00629 * \param f_rng RNG function 00630 * \param p_rng RNG parameter 00631 * 00632 * \return 0 if successful, 00633 * or a POLARSSL_ERR_ECP_XXX or POLARSSL_MPI_XXX error code 00634 */ 00635 int ecp_gen_key( ecp_group_id grp_id, ecp_keypair *key, 00636 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng ); 00637 00638 #if defined(POLARSSL_SELF_TEST) 00639 /** 00640 * \brief Checkup routine 00641 * 00642 * \return 0 if successful, or 1 if a test failed 00643 */ 00644 int ecp_self_test( int verbose ); 00645 #endif 00646 00647 #ifdef __cplusplus 00648 } 00649 #endif 00650 00651 #endif /* ecp.h */ 00652 00653
Generated on Tue Jul 12 2022 19:40:15 by
1.7.2