source: azure_iot_hub_mbedtls/trunk/mbedtls-2.16.1/include/mbedtls/ecp.h@ 398

Last change on this file since 398 was 398, checked in by coas-nagasima, 5 years ago

mbedTLS版Azure IoT Hub接続サンプルのソースコードを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-chdr;charset=UTF-8
File size: 49.5 KB
Line 
1/**
2 * \file ecp.h
3 *
4 * \brief This file provides an API for Elliptic Curves over GF(P) (ECP).
5 *
6 * The use of ECP in cryptography and TLS is defined in
7 * <em>Standards for Efficient Cryptography Group (SECG): SEC1
8 * Elliptic Curve Cryptography</em> and
9 * <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 *
15 */
16
17/*
18 * Copyright (C) 2006-2018, Arm Limited (or its affiliates), All Rights Reserved
19 * 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.
32 *
33 * This file is part of Mbed TLS (https://tls.mbed.org)
34 */
35
36#ifndef MBEDTLS_ECP_H
37#define MBEDTLS_ECP_H
38
39#if !defined(MBEDTLS_CONFIG_FILE)
40#include "config.h"
41#else
42#include MBEDTLS_CONFIG_FILE
43#endif
44
45#include "bignum.h"
46
47/*
48 * ECP error codes
49 */
50#define MBEDTLS_ERR_ECP_BAD_INPUT_DATA -0x4F80 /**< Bad input parameters to function. */
51#define MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL -0x4F00 /**< The buffer is too small to write to. */
52#define MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE -0x4E80 /**< The requested feature is not available, for example, the requested curve is not supported. */
53#define MBEDTLS_ERR_ECP_VERIFY_FAILED -0x4E00 /**< The signature is not valid. */
54#define MBEDTLS_ERR_ECP_ALLOC_FAILED -0x4D80 /**< Memory allocation failed. */
55#define MBEDTLS_ERR_ECP_RANDOM_FAILED -0x4D00 /**< Generation of random value, such as ephemeral key, failed. */
56#define MBEDTLS_ERR_ECP_INVALID_KEY -0x4C80 /**< Invalid private or public key. */
57#define MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH -0x4C00 /**< The buffer contains a valid signature followed by more data. */
58
59/* MBEDTLS_ERR_ECP_HW_ACCEL_FAILED is deprecated and should not be used. */
60#define MBEDTLS_ERR_ECP_HW_ACCEL_FAILED -0x4B80 /**< The ECP hardware accelerator failed. */
61
62#define MBEDTLS_ERR_ECP_IN_PROGRESS -0x4B00 /**< Operation in progress, call again with the same parameters to continue. */
63
64#ifdef __cplusplus
65extern "C" {
66#endif
67
68/**
69 * Domain-parameter identifiers: curve, subgroup, and generator.
70 *
71 * \note Only curves over prime fields are supported.
72 *
73 * \warning This library does not support validation of arbitrary domain
74 * parameters. Therefore, only standardized domain parameters from trusted
75 * sources should be used. See mbedtls_ecp_group_load().
76 */
77typedef enum
78{
79 MBEDTLS_ECP_DP_NONE = 0, /*!< Curve not defined. */
80 MBEDTLS_ECP_DP_SECP192R1, /*!< Domain parameters for the 192-bit curve defined by FIPS 186-4 and SEC1. */
81 MBEDTLS_ECP_DP_SECP224R1, /*!< Domain parameters for the 224-bit curve defined by FIPS 186-4 and SEC1. */
82 MBEDTLS_ECP_DP_SECP256R1, /*!< Domain parameters for the 256-bit curve defined by FIPS 186-4 and SEC1. */
83 MBEDTLS_ECP_DP_SECP384R1, /*!< Domain parameters for the 384-bit curve defined by FIPS 186-4 and SEC1. */
84 MBEDTLS_ECP_DP_SECP521R1, /*!< Domain parameters for the 521-bit curve defined by FIPS 186-4 and SEC1. */
85 MBEDTLS_ECP_DP_BP256R1, /*!< Domain parameters for 256-bit Brainpool curve. */
86 MBEDTLS_ECP_DP_BP384R1, /*!< Domain parameters for 384-bit Brainpool curve. */
87 MBEDTLS_ECP_DP_BP512R1, /*!< Domain parameters for 512-bit Brainpool curve. */
88 MBEDTLS_ECP_DP_CURVE25519, /*!< Domain parameters for Curve25519. */
89 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. */
92 MBEDTLS_ECP_DP_CURVE448, /*!< Domain parameters for Curve448. */
93} mbedtls_ecp_group_id;
94
95/**
96 * The number of supported curves, plus one for #MBEDTLS_ECP_DP_NONE.
97 *
98 * \note Montgomery curves are currently excluded.
99 */
100#define MBEDTLS_ECP_DP_MAX 12
101
102/**
103 * Curve information, for use by other modules.
104 */
105typedef struct mbedtls_ecp_curve_info
106{
107 mbedtls_ecp_group_id grp_id; /*!< An internal identifier. */
108 uint16_t tls_id; /*!< The TLS NamedCurve identifier. */
109 uint16_t bit_size; /*!< The curve size in bits. */
110 const char *name; /*!< A human-friendly name. */
111} mbedtls_ecp_curve_info;
112
113/**
114 * \brief The ECP point structure, in Jacobian coordinates.
115 *
116 * \note All functions expect and return points satisfying
117 * the following condition: <code>Z == 0</code> or
118 * <code>Z == 1</code>. Other values of \p Z are
119 * used only by internal functions.
120 * The point is zero, or "at infinity", if <code>Z == 0</code>.
121 * Otherwise, \p X and \p Y are its standard (affine)
122 * coordinates.
123 */
124typedef struct mbedtls_ecp_point
125{
126 mbedtls_mpi X; /*!< The X coordinate of the ECP point. */
127 mbedtls_mpi Y; /*!< The Y coordinate of the ECP point. */
128 mbedtls_mpi Z; /*!< The Z coordinate of the ECP point. */
129}
130mbedtls_ecp_point;
131
132#if !defined(MBEDTLS_ECP_ALT)
133/*
134 * default mbed TLS elliptic curve arithmetic implementation
135 *
136 * (in case MBEDTLS_ECP_ALT is defined then the developer has to provide an
137 * alternative implementation for the whole module and it will replace this
138 * one.)
139 */
140
141/**
142 * \brief The ECP group structure.
143 *
144 * We consider two types of curve equations:
145 * <ul><li>Short Weierstrass: <code>y^2 = x^3 + A x + B mod P</code>
146 * (SEC1 + RFC-4492)</li>
147 * <li>Montgomery: <code>y^2 = x^3 + A x^2 + x mod P</code> (Curve25519,
148 * Curve448)</li></ul>
149 * In both cases, the generator (\p G) for a prime-order subgroup is fixed.
150 *
151 * For Short Weierstrass, this subgroup is the whole curve, and its
152 * cardinality is denoted by \p N. Our code requires that \p N is an
153 * odd prime as mbedtls_ecp_mul() requires an odd number, and
154 * mbedtls_ecdsa_sign() requires that it is prime for blinding purposes.
155 *
156 * For Montgomery curves, we do not store \p A, but <code>(A + 2) / 4</code>,
157 * which is the quantity used in the formulas. Additionally, \p nbits is
158 * not the size of \p N but the required size for private keys.
159 *
160 * If \p modp is NULL, reduction modulo \p P is done using a generic algorithm.
161 * Otherwise, \p modp must point to a function that takes an \p mbedtls_mpi in the
162 * range of <code>0..2^(2*pbits)-1</code>, and transforms it in-place to an integer
163 * which is congruent mod \p P to the given MPI, and is close enough to \p pbits
164 * in size, so that it may be efficiently brought in the 0..P-1 range by a few
165 * additions or subtractions. Therefore, it is only an approximative modular
166 * reduction. It must return 0 on success and non-zero on failure.
167 *
168 * \note Alternative implementations must keep the group IDs distinct. If
169 * two group structures have the same ID, then they must be
170 * identical.
171 *
172 */
173typedef struct mbedtls_ecp_group
174{
175 mbedtls_ecp_group_id id; /*!< An internal group identifier. */
176 mbedtls_mpi P; /*!< The prime modulus of the base field. */
177 mbedtls_mpi A; /*!< For Short Weierstrass: \p A in the equation. For
178 Montgomery curves: <code>(A + 2) / 4</code>. */
179 mbedtls_mpi B; /*!< For Short Weierstrass: \p B in the equation.
180 For Montgomery curves: unused. */
181 mbedtls_ecp_point G; /*!< The generator of the subgroup used. */
182 mbedtls_mpi N; /*!< The order of \p G. */
183 size_t pbits; /*!< The number of bits in \p P.*/
184 size_t nbits; /*!< For Short Weierstrass: The number of bits in \p P.
185 For Montgomery curves: the number of bits in the
186 private keys. */
187 unsigned int h; /*!< \internal 1 if the constants are static. */
188 int (*modp)(mbedtls_mpi *); /*!< The function for fast pseudo-reduction
189 mod \p P (see above).*/
190 int (*t_pre)(mbedtls_ecp_point *, void *); /*!< Unused. */
191 int (*t_post)(mbedtls_ecp_point *, void *); /*!< Unused. */
192 void *t_data; /*!< Unused. */
193 mbedtls_ecp_point *T; /*!< Pre-computed points for ecp_mul_comb(). */
194 size_t T_size; /*!< The number of pre-computed points. */
195}
196mbedtls_ecp_group;
197
198/**
199 * \name SECTION: Module settings
200 *
201 * The configuration options you can set for this module are in this section.
202 * Either change them in config.h, or define them using the compiler command line.
203 * \{
204 */
205
206#if !defined(MBEDTLS_ECP_MAX_BITS)
207/**
208 * The maximum size of the groups, that is, of \c N and \c P.
209 */
210#define MBEDTLS_ECP_MAX_BITS 521 /**< The maximum size of groups, in bits. */
211#endif
212
213#define MBEDTLS_ECP_MAX_BYTES ( ( MBEDTLS_ECP_MAX_BITS + 7 ) / 8 )
214#define MBEDTLS_ECP_MAX_PT_LEN ( 2 * MBEDTLS_ECP_MAX_BYTES + 1 )
215
216#if !defined(MBEDTLS_ECP_WINDOW_SIZE)
217/*
218 * Maximum "window" size used for point multiplication.
219 * Default: 6.
220 * Minimum value: 2. Maximum value: 7.
221 *
222 * Result is an array of at most ( 1 << ( MBEDTLS_ECP_WINDOW_SIZE - 1 ) )
223 * points used for point multiplication. This value is directly tied to EC
224 * peak memory usage, so decreasing it by one should roughly cut memory usage
225 * by two (if large curves are in use).
226 *
227 * Reduction in size may reduce speed, but larger curves are impacted first.
228 * Sample performances (in ECDHE handshakes/s, with FIXED_POINT_OPTIM = 1):
229 * w-size: 6 5 4 3 2
230 * 521 145 141 135 120 97
231 * 384 214 209 198 177 146
232 * 256 320 320 303 262 226
233 * 224 475 475 453 398 342
234 * 192 640 640 633 587 476
235 */
236#define MBEDTLS_ECP_WINDOW_SIZE 6 /**< The maximum window size used. */
237#endif /* MBEDTLS_ECP_WINDOW_SIZE */
238
239#if !defined(MBEDTLS_ECP_FIXED_POINT_OPTIM)
240/*
241 * Trade memory for speed on fixed-point multiplication.
242 *
243 * This speeds up repeated multiplication of the generator (that is, the
244 * multiplication in ECDSA signatures, and half of the multiplications in
245 * ECDSA verification and ECDHE) by a factor roughly 3 to 4.
246 *
247 * The cost is increasing EC peak memory usage by a factor roughly 2.
248 *
249 * Change this value to 0 to reduce peak memory usage.
250 */
251#define MBEDTLS_ECP_FIXED_POINT_OPTIM 1 /**< Enable fixed-point speed-up. */
252#endif /* MBEDTLS_ECP_FIXED_POINT_OPTIM */
253
254/* \} name SECTION: Module settings */
255
256#else /* MBEDTLS_ECP_ALT */
257#include "ecp_alt.h"
258#endif /* MBEDTLS_ECP_ALT */
259
260#if defined(MBEDTLS_ECP_RESTARTABLE)
261
262/**
263 * \brief Internal restart context for multiplication
264 *
265 * \note Opaque struct
266 */
267typedef struct mbedtls_ecp_restart_mul mbedtls_ecp_restart_mul_ctx;
268
269/**
270 * \brief Internal restart context for ecp_muladd()
271 *
272 * \note Opaque struct
273 */
274typedef struct mbedtls_ecp_restart_muladd mbedtls_ecp_restart_muladd_ctx;
275
276/**
277 * \brief General context for resuming ECC operations
278 */
279typedef struct
280{
281 unsigned ops_done; /*!< current ops count */
282 unsigned depth; /*!< call depth (0 = top-level) */
283 mbedtls_ecp_restart_mul_ctx *rsm; /*!< ecp_mul_comb() sub-context */
284 mbedtls_ecp_restart_muladd_ctx *ma; /*!< ecp_muladd() sub-context */
285} mbedtls_ecp_restart_ctx;
286
287/*
288 * Operation counts for restartable functions
289 */
290#define MBEDTLS_ECP_OPS_CHK 3 /*!< basic ops count for ecp_check_pubkey() */
291#define MBEDTLS_ECP_OPS_DBL 8 /*!< basic ops count for ecp_double_jac() */
292#define MBEDTLS_ECP_OPS_ADD 11 /*!< basic ops count for see ecp_add_mixed() */
293#define MBEDTLS_ECP_OPS_INV 120 /*!< empirical equivalent for mpi_mod_inv() */
294
295/**
296 * \brief Internal; for restartable functions in other modules.
297 * Check and update basic ops budget.
298 *
299 * \param grp Group structure
300 * \param rs_ctx Restart context
301 * \param ops Number of basic ops to do
302 *
303 * \return \c 0 if doing \p ops basic ops is still allowed,
304 * \return #MBEDTLS_ERR_ECP_IN_PROGRESS otherwise.
305 */
306int mbedtls_ecp_check_budget( const mbedtls_ecp_group *grp,
307 mbedtls_ecp_restart_ctx *rs_ctx,
308 unsigned ops );
309
310/* Utility macro for checking and updating ops budget */
311#define MBEDTLS_ECP_BUDGET( ops ) \
312 MBEDTLS_MPI_CHK( mbedtls_ecp_check_budget( grp, rs_ctx, \
313 (unsigned) (ops) ) );
314
315#else /* MBEDTLS_ECP_RESTARTABLE */
316
317#define MBEDTLS_ECP_BUDGET( ops ) /* no-op; for compatibility */
318
319/* We want to declare restartable versions of existing functions anyway */
320typedef void mbedtls_ecp_restart_ctx;
321
322#endif /* MBEDTLS_ECP_RESTARTABLE */
323
324/**
325 * \brief The ECP key-pair structure.
326 *
327 * A generic key-pair that may be used for ECDSA and fixed ECDH, for example.
328 *
329 * \note Members are deliberately in the same order as in the
330 * ::mbedtls_ecdsa_context structure.
331 */
332typedef struct mbedtls_ecp_keypair
333{
334 mbedtls_ecp_group grp; /*!< Elliptic curve and base point */
335 mbedtls_mpi d; /*!< our secret value */
336 mbedtls_ecp_point Q; /*!< our public value */
337}
338mbedtls_ecp_keypair;
339
340/*
341 * Point formats, from RFC 4492's enum ECPointFormat
342 */
343#define MBEDTLS_ECP_PF_UNCOMPRESSED 0 /**< Uncompressed point format. */
344#define MBEDTLS_ECP_PF_COMPRESSED 1 /**< Compressed point format. */
345
346/*
347 * Some other constants from RFC 4492
348 */
349#define MBEDTLS_ECP_TLS_NAMED_CURVE 3 /**< The named_curve of ECCurveType. */
350
351#if defined(MBEDTLS_ECP_RESTARTABLE)
352/**
353 * \brief Set the maximum number of basic operations done in a row.
354 *
355 * If more operations are needed to complete a computation,
356 * #MBEDTLS_ERR_ECP_IN_PROGRESS will be returned by the
357 * function performing the computation. It is then the
358 * caller's responsibility to either call again with the same
359 * parameters until it returns 0 or an error code; or to free
360 * the restart context if the operation is to be aborted.
361 *
362 * It is strictly required that all input parameters and the
363 * restart context be the same on successive calls for the
364 * same operation, but output parameters need not be the
365 * same; they must not be used until the function finally
366 * returns 0.
367 *
368 * This only applies to functions whose documentation
369 * mentions they may return #MBEDTLS_ERR_ECP_IN_PROGRESS (or
370 * #MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS for functions in the
371 * SSL module). For functions that accept a "restart context"
372 * argument, passing NULL disables restart and makes the
373 * function equivalent to the function with the same name
374 * with \c _restartable removed. For functions in the ECDH
375 * module, restart is disabled unless the function accepts
376 * an "ECDH context" argument and
377 * mbedtls_ecdh_enable_restart() was previously called on
378 * that context. For function in the SSL module, restart is
379 * only enabled for specific sides and key exchanges
380 * (currently only for clients and ECDHE-ECDSA).
381 *
382 * \param max_ops Maximum number of basic operations done in a row.
383 * Default: 0 (unlimited).
384 * Lower (non-zero) values mean ECC functions will block for
385 * a lesser maximum amount of time.
386 *
387 * \note A "basic operation" is defined as a rough equivalent of a
388 * multiplication in GF(p) for the NIST P-256 curve.
389 * As an indication, with default settings, a scalar
390 * multiplication (full run of \c mbedtls_ecp_mul()) is:
391 * - about 3300 basic operations for P-256
392 * - about 9400 basic operations for P-384
393 *
394 * \note Very low values are not always respected: sometimes
395 * functions need to block for a minimum number of
396 * operations, and will do so even if max_ops is set to a
397 * lower value. That minimum depends on the curve size, and
398 * can be made lower by decreasing the value of
399 * \c MBEDTLS_ECP_WINDOW_SIZE. As an indication, here is the
400 * lowest effective value for various curves and values of
401 * that parameter (w for short):
402 * w=6 w=5 w=4 w=3 w=2
403 * P-256 208 208 160 136 124
404 * P-384 682 416 320 272 248
405 * P-521 1364 832 640 544 496
406 *
407 * \note This setting is currently ignored by Curve25519.
408 */
409void mbedtls_ecp_set_max_ops( unsigned max_ops );
410
411/**
412 * \brief Check if restart is enabled (max_ops != 0)
413 *
414 * \return \c 0 if \c max_ops == 0 (restart disabled)
415 * \return \c 1 otherwise (restart enabled)
416 */
417int mbedtls_ecp_restart_is_enabled( void );
418#endif /* MBEDTLS_ECP_RESTARTABLE */
419
420/**
421 * \brief This function retrieves the information defined in
422 * mbedtls_ecp_curve_info() for all supported curves in order
423 * of preference.
424 *
425 * \return A statically allocated array. The last entry is 0.
426 */
427const mbedtls_ecp_curve_info *mbedtls_ecp_curve_list( void );
428
429/**
430 * \brief This function retrieves the list of internal group
431 * identifiers of all supported curves in the order of
432 * preference.
433 *
434 * \return A statically allocated array,
435 * terminated with MBEDTLS_ECP_DP_NONE.
436 */
437const mbedtls_ecp_group_id *mbedtls_ecp_grp_id_list( void );
438
439/**
440 * \brief This function retrieves curve information from an internal
441 * group identifier.
442 *
443 * \param grp_id An \c MBEDTLS_ECP_DP_XXX value.
444 *
445 * \return The associated curve information on success.
446 * \return NULL on failure.
447 */
448const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_grp_id( mbedtls_ecp_group_id grp_id );
449
450/**
451 * \brief This function retrieves curve information from a TLS
452 * NamedCurve value.
453 *
454 * \param tls_id An \c MBEDTLS_ECP_DP_XXX value.
455 *
456 * \return The associated curve information on success.
457 * \return NULL on failure.
458 */
459const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_tls_id( uint16_t tls_id );
460
461/**
462 * \brief This function retrieves curve information from a
463 * human-readable name.
464 *
465 * \param name The human-readable name.
466 *
467 * \return The associated curve information on success.
468 * \return NULL on failure.
469 */
470const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_name( const char *name );
471
472/**
473 * \brief This function initializes a point as zero.
474 *
475 * \param pt The point to initialize.
476 */
477void mbedtls_ecp_point_init( mbedtls_ecp_point *pt );
478
479/**
480 * \brief This function initializes an ECP group context
481 * without loading any domain parameters.
482 *
483 * \note After this function is called, domain parameters
484 * for various ECP groups can be loaded through the
485 * mbedtls_ecp_load() or mbedtls_ecp_tls_read_group()
486 * functions.
487 */
488void mbedtls_ecp_group_init( mbedtls_ecp_group *grp );
489
490/**
491 * \brief This function initializes a key pair as an invalid one.
492 *
493 * \param key The key pair to initialize.
494 */
495void mbedtls_ecp_keypair_init( mbedtls_ecp_keypair *key );
496
497/**
498 * \brief This function frees the components of a point.
499 *
500 * \param pt The point to free.
501 */
502void mbedtls_ecp_point_free( mbedtls_ecp_point *pt );
503
504/**
505 * \brief This function frees the components of an ECP group.
506 *
507 * \param grp The group to free. This may be \c NULL, in which
508 * case this function returns immediately. If it is not
509 * \c NULL, it must point to an initialized ECP group.
510 */
511void mbedtls_ecp_group_free( mbedtls_ecp_group *grp );
512
513/**
514 * \brief This function frees the components of a key pair.
515 *
516 * \param key The key pair to free. This may be \c NULL, in which
517 * case this function returns immediately. If it is not
518 * \c NULL, it must point to an initialized ECP key pair.
519 */
520void mbedtls_ecp_keypair_free( mbedtls_ecp_keypair *key );
521
522#if defined(MBEDTLS_ECP_RESTARTABLE)
523/**
524 * \brief Initialize a restart context.
525 *
526 * \param ctx The restart context to initialize. This must
527 * not be \c NULL.
528 */
529void mbedtls_ecp_restart_init( mbedtls_ecp_restart_ctx *ctx );
530
531/**
532 * \brief Free the components of a restart context.
533 *
534 * \param ctx The restart context to free. This may be \c NULL, in which
535 * case this function returns immediately. If it is not
536 * \c NULL, it must point to an initialized restart context.
537 */
538void mbedtls_ecp_restart_free( mbedtls_ecp_restart_ctx *ctx );
539#endif /* MBEDTLS_ECP_RESTARTABLE */
540
541/**
542 * \brief This function copies the contents of point \p Q into
543 * point \p P.
544 *
545 * \param P The destination point. This must be initialized.
546 * \param Q The source point. This must be initialized.
547 *
548 * \return \c 0 on success.
549 * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure.
550 * \return Another negative error code for other kinds of failure.
551 */
552int mbedtls_ecp_copy( mbedtls_ecp_point *P, const mbedtls_ecp_point *Q );
553
554/**
555 * \brief This function copies the contents of group \p src into
556 * group \p dst.
557 *
558 * \param dst The destination group. This must be initialized.
559 * \param src The source group. This must be initialized.
560 *
561 * \return \c 0 on success.
562 * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure.
563 * \return Another negative error code on other kinds of failure.
564 */
565int mbedtls_ecp_group_copy( mbedtls_ecp_group *dst,
566 const mbedtls_ecp_group *src );
567
568/**
569 * \brief This function sets a point to the point at infinity.
570 *
571 * \param pt The point to set. This must be initialized.
572 *
573 * \return \c 0 on success.
574 * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure.
575 * \return Another negative error code on other kinds of failure.
576 */
577int mbedtls_ecp_set_zero( mbedtls_ecp_point *pt );
578
579/**
580 * \brief This function checks if a point is the point at infinity.
581 *
582 * \param pt The point to test. This must be initialized.
583 *
584 * \return \c 1 if the point is zero.
585 * \return \c 0 if the point is non-zero.
586 * \return A negative error code on failure.
587 */
588int mbedtls_ecp_is_zero( mbedtls_ecp_point *pt );
589
590/**
591 * \brief This function compares two points.
592 *
593 * \note This assumes that the points are normalized. Otherwise,
594 * they may compare as "not equal" even if they are.
595 *
596 * \param P The first point to compare. This must be initialized.
597 * \param Q The second point to compare. This must be initialized.
598 *
599 * \return \c 0 if the points are equal.
600 * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if the points are not equal.
601 */
602int mbedtls_ecp_point_cmp( const mbedtls_ecp_point *P,
603 const mbedtls_ecp_point *Q );
604
605/**
606 * \brief This function imports a non-zero point from two ASCII
607 * strings.
608 *
609 * \param P The destination point. This must be initialized.
610 * \param radix The numeric base of the input.
611 * \param x The first affine coordinate, as a null-terminated string.
612 * \param y The second affine coordinate, as a null-terminated string.
613 *
614 * \return \c 0 on success.
615 * \return An \c MBEDTLS_ERR_MPI_XXX error code on failure.
616 */
617int mbedtls_ecp_point_read_string( mbedtls_ecp_point *P, int radix,
618 const char *x, const char *y );
619
620/**
621 * \brief This function exports a point into unsigned binary data.
622 *
623 * \param grp The group to which the point should belong.
624 * This must be initialized and have group parameters
625 * set, for example through mbedtls_ecp_group_load().
626 * \param P The point to export. This must be initialized.
627 * \param format The point format. This must be either
628 * #MBEDTLS_ECP_PF_COMPRESSED or #MBEDTLS_ECP_PF_UNCOMPRESSED.
629 * \param olen The address at which to store the length of
630 * the output in Bytes. This must not be \c NULL.
631 * \param buf The output buffer. This must be a writable buffer
632 * of length \p buflen Bytes.
633 * \param buflen The length of the output buffer \p buf in Bytes.
634 *
635 * \return \c 0 on success.
636 * \return #MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL if the output buffer
637 * is too small to hold the point.
638 * \return Another negative error code on other kinds of failure.
639 */
640int mbedtls_ecp_point_write_binary( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *P,
641 int format, size_t *olen,
642 unsigned char *buf, size_t buflen );
643
644/**
645 * \brief This function imports a point from unsigned binary data.
646 *
647 * \note This function does not check that the point actually
648 * belongs to the given group, see mbedtls_ecp_check_pubkey()
649 * for that.
650 *
651 * \param grp The group to which the point should belong.
652 * This must be initialized and have group parameters
653 * set, for example through mbedtls_ecp_group_load().
654 * \param P The destination context to import the point to.
655 * This must be initialized.
656 * \param buf The input buffer. This must be a readable buffer
657 * of length \p ilen Bytes.
658 * \param ilen The length of the input buffer \p buf in Bytes.
659 *
660 * \return \c 0 on success.
661 * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if the input is invalid.
662 * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure.
663 * \return #MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE if the point format
664 * is not implemented.
665 */
666int mbedtls_ecp_point_read_binary( const mbedtls_ecp_group *grp,
667 mbedtls_ecp_point *P,
668 const unsigned char *buf, size_t ilen );
669
670/**
671 * \brief This function imports a point from a TLS ECPoint record.
672 *
673 * \note On function return, \p *buf is updated to point immediately
674 * after the ECPoint record.
675 *
676 * \param grp The ECP group to use.
677 * This must be initialized and have group parameters
678 * set, for example through mbedtls_ecp_group_load().
679 * \param pt The destination point.
680 * \param buf The address of the pointer to the start of the input buffer.
681 * \param len The length of the buffer.
682 *
683 * \return \c 0 on success.
684 * \return An \c MBEDTLS_ERR_MPI_XXX error code on initialization
685 * failure.
686 * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if input is invalid.
687 */
688int mbedtls_ecp_tls_read_point( const mbedtls_ecp_group *grp,
689 mbedtls_ecp_point *pt,
690 const unsigned char **buf, size_t len );
691
692/**
693 * \brief This function exports a point as a TLS ECPoint record
694 * defined in RFC 4492, Section 5.4.
695 *
696 * \param grp The ECP group to use.
697 * This must be initialized and have group parameters
698 * set, for example through mbedtls_ecp_group_load().
699 * \param pt The point to be exported. This must be initialized.
700 * \param format The point format to use. This must be either
701 * #MBEDTLS_ECP_PF_COMPRESSED or #MBEDTLS_ECP_PF_UNCOMPRESSED.
702 * \param olen The address at which to store the length in Bytes
703 * of the data written.
704 * \param buf The target buffer. This must be a writable buffer of
705 * length \p blen Bytes.
706 * \param blen The length of the target buffer \p buf in Bytes.
707 *
708 * \return \c 0 on success.
709 * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if the input is invalid.
710 * \return #MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL if the target buffer
711 * is too small to hold the exported point.
712 * \return Another negative error code on other kinds of failure.
713 */
714int mbedtls_ecp_tls_write_point( const mbedtls_ecp_group *grp,
715 const mbedtls_ecp_point *pt,
716 int format, size_t *olen,
717 unsigned char *buf, size_t blen );
718
719/**
720 * \brief This function sets up an ECP group context
721 * from a standardized set of domain parameters.
722 *
723 * \note The index should be a value of the NamedCurve enum,
724 * as defined in <em>RFC-4492: Elliptic Curve Cryptography
725 * (ECC) Cipher Suites for Transport Layer Security (TLS)</em>,
726 * usually in the form of an \c MBEDTLS_ECP_DP_XXX macro.
727 *
728 * \param grp The group context to setup. This must be initialized.
729 * \param id The identifier of the domain parameter set to load.
730 *
731 * \return \c 0 on success.
732 * \return #MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE if \p id doesn't
733 * correspond to a known group.
734 * \return Another negative error code on other kinds of failure.
735 */
736int mbedtls_ecp_group_load( mbedtls_ecp_group *grp, mbedtls_ecp_group_id id );
737
738/**
739 * \brief This function sets up an ECP group context from a TLS
740 * ECParameters record as defined in RFC 4492, Section 5.4.
741 *
742 * \note The read pointer \p buf is updated to point right after
743 * the ECParameters record on exit.
744 *
745 * \param grp The group context to setup. This must be initialized.
746 * \param buf The address of the pointer to the start of the input buffer.
747 * \param len The length of the input buffer \c *buf in Bytes.
748 *
749 * \return \c 0 on success.
750 * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if input is invalid.
751 * \return #MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE if the group is not
752 * recognized.
753 * \return Another negative error code on other kinds of failure.
754 */
755int mbedtls_ecp_tls_read_group( mbedtls_ecp_group *grp,
756 const unsigned char **buf, size_t len );
757
758/**
759 * \brief This function extracts an elliptic curve group ID from a
760 * TLS ECParameters record as defined in RFC 4492, Section 5.4.
761 *
762 * \note The read pointer \p buf is updated to point right after
763 * the ECParameters record on exit.
764 *
765 * \param grp The address at which to store the group id.
766 * This must not be \c NULL.
767 * \param buf The address of the pointer to the start of the input buffer.
768 * \param len The length of the input buffer \c *buf in Bytes.
769 *
770 * \return \c 0 on success.
771 * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if input is invalid.
772 * \return #MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE if the group is not
773 * recognized.
774 * \return Another negative error code on other kinds of failure.
775 */
776int mbedtls_ecp_tls_read_group_id( mbedtls_ecp_group_id *grp,
777 const unsigned char **buf,
778 size_t len );
779/**
780 * \brief This function exports an elliptic curve as a TLS
781 * ECParameters record as defined in RFC 4492, Section 5.4.
782 *
783 * \param grp The ECP group to be exported.
784 * This must be initialized and have group parameters
785 * set, for example through mbedtls_ecp_group_load().
786 * \param olen The address at which to store the number of Bytes written.
787 * This must not be \c NULL.
788 * \param buf The buffer to write to. This must be a writable buffer
789 * of length \p blen Bytes.
790 * \param blen The length of the output buffer \p buf in Bytes.
791 *
792 * \return \c 0 on success.
793 * \return #MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL if the output
794 * buffer is too small to hold the exported group.
795 * \return Another negative error code on other kinds of failure.
796 */
797int mbedtls_ecp_tls_write_group( const mbedtls_ecp_group *grp,
798 size_t *olen,
799 unsigned char *buf, size_t blen );
800
801/**
802 * \brief This function performs a scalar multiplication of a point
803 * by an integer: \p R = \p m * \p P.
804 *
805 * It is not thread-safe to use same group in multiple threads.
806 *
807 * \note To prevent timing attacks, this function
808 * executes the exact same sequence of base-field
809 * operations for any valid \p m. It avoids any if-branch or
810 * array index depending on the value of \p m.
811 *
812 * \note If \p f_rng is not NULL, it is used to randomize
813 * intermediate results to prevent potential timing attacks
814 * targeting these results. We recommend always providing
815 * a non-NULL \p f_rng. The overhead is negligible.
816 *
817 * \param grp The ECP group to use.
818 * This must be initialized and have group parameters
819 * set, for example through mbedtls_ecp_group_load().
820 * \param R The point in which to store the result of the calculation.
821 * This must be initialized.
822 * \param m The integer by which to multiply. This must be initialized.
823 * \param P The point to multiply. This must be initialized.
824 * \param f_rng The RNG function. This may be \c NULL if randomization
825 * of intermediate results isn't desired (discouraged).
826 * \param p_rng The RNG context to be passed to \p p_rng.
827 *
828 * \return \c 0 on success.
829 * \return #MBEDTLS_ERR_ECP_INVALID_KEY if \p m is not a valid private
830 * key, or \p P is not a valid public key.
831 * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure.
832 * \return Another negative error code on other kinds of failure.
833 */
834int mbedtls_ecp_mul( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
835 const mbedtls_mpi *m, const mbedtls_ecp_point *P,
836 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
837
838/**
839 * \brief This function performs multiplication of a point by
840 * an integer: \p R = \p m * \p P in a restartable way.
841 *
842 * \see mbedtls_ecp_mul()
843 *
844 * \note This function does the same as \c mbedtls_ecp_mul(), but
845 * it can return early and restart according to the limit set
846 * with \c mbedtls_ecp_set_max_ops() to reduce blocking.
847 *
848 * \param grp The ECP group to use.
849 * This must be initialized and have group parameters
850 * set, for example through mbedtls_ecp_group_load().
851 * \param R The point in which to store the result of the calculation.
852 * This must be initialized.
853 * \param m The integer by which to multiply. This must be initialized.
854 * \param P The point to multiply. This must be initialized.
855 * \param f_rng The RNG function. This may be \c NULL if randomization
856 * of intermediate results isn't desired (discouraged).
857 * \param p_rng The RNG context to be passed to \p p_rng.
858 * \param rs_ctx The restart context (NULL disables restart).
859 *
860 * \return \c 0 on success.
861 * \return #MBEDTLS_ERR_ECP_INVALID_KEY if \p m is not a valid private
862 * key, or \p P is not a valid public key.
863 * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure.
864 * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of
865 * operations was reached: see \c mbedtls_ecp_set_max_ops().
866 * \return Another negative error code on other kinds of failure.
867 */
868int mbedtls_ecp_mul_restartable( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
869 const mbedtls_mpi *m, const mbedtls_ecp_point *P,
870 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
871 mbedtls_ecp_restart_ctx *rs_ctx );
872
873/**
874 * \brief This function performs multiplication and addition of two
875 * points by integers: \p R = \p m * \p P + \p n * \p Q
876 *
877 * It is not thread-safe to use same group in multiple threads.
878 *
879 * \note In contrast to mbedtls_ecp_mul(), this function does not
880 * guarantee a constant execution flow and timing.
881 *
882 * \param grp The ECP group to use.
883 * This must be initialized and have group parameters
884 * set, for example through mbedtls_ecp_group_load().
885 * \param R The point in which to store the result of the calculation.
886 * This must be initialized.
887 * \param m The integer by which to multiply \p P.
888 * This must be initialized.
889 * \param P The point to multiply by \p m. This must be initialized.
890 * \param n The integer by which to multiply \p Q.
891 * This must be initialized.
892 * \param Q The point to be multiplied by \p n.
893 * This must be initialized.
894 *
895 * \return \c 0 on success.
896 * \return #MBEDTLS_ERR_ECP_INVALID_KEY if \p m or \p n are not
897 * valid private keys, or \p P or \p Q are not valid public
898 * keys.
899 * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure.
900 * \return Another negative error code on other kinds of failure.
901 */
902int mbedtls_ecp_muladd( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
903 const mbedtls_mpi *m, const mbedtls_ecp_point *P,
904 const mbedtls_mpi *n, const mbedtls_ecp_point *Q );
905
906/**
907 * \brief This function performs multiplication and addition of two
908 * points by integers: \p R = \p m * \p P + \p n * \p Q in a
909 * restartable way.
910 *
911 * \see \c mbedtls_ecp_muladd()
912 *
913 * \note This function works the same as \c mbedtls_ecp_muladd(),
914 * but it can return early and restart according to the limit
915 * set with \c mbedtls_ecp_set_max_ops() to reduce blocking.
916 *
917 * \param grp The ECP group to use.
918 * This must be initialized and have group parameters
919 * set, for example through mbedtls_ecp_group_load().
920 * \param R The point in which to store the result of the calculation.
921 * This must be initialized.
922 * \param m The integer by which to multiply \p P.
923 * This must be initialized.
924 * \param P The point to multiply by \p m. This must be initialized.
925 * \param n The integer by which to multiply \p Q.
926 * This must be initialized.
927 * \param Q The point to be multiplied by \p n.
928 * This must be initialized.
929 * \param rs_ctx The restart context (NULL disables restart).
930 *
931 * \return \c 0 on success.
932 * \return #MBEDTLS_ERR_ECP_INVALID_KEY if \p m or \p n are not
933 * valid private keys, or \p P or \p Q are not valid public
934 * keys.
935 * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED on memory-allocation failure.
936 * \return #MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of
937 * operations was reached: see \c mbedtls_ecp_set_max_ops().
938 * \return Another negative error code on other kinds of failure.
939 */
940int mbedtls_ecp_muladd_restartable(
941 mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
942 const mbedtls_mpi *m, const mbedtls_ecp_point *P,
943 const mbedtls_mpi *n, const mbedtls_ecp_point *Q,
944 mbedtls_ecp_restart_ctx *rs_ctx );
945
946/**
947 * \brief This function checks that a point is a valid public key
948 * on this curve.
949 *
950 * It only checks that the point is non-zero, has
951 * valid coordinates and lies on the curve. It does not verify
952 * that it is indeed a multiple of \p G. This additional
953 * check is computationally more expensive, is not required
954 * by standards, and should not be necessary if the group
955 * used has a small cofactor. In particular, it is useless for
956 * the NIST groups which all have a cofactor of 1.
957 *
958 * \note This function uses bare components rather than an
959 * ::mbedtls_ecp_keypair structure, to ease use with other
960 * structures, such as ::mbedtls_ecdh_context or
961 * ::mbedtls_ecdsa_context.
962 *
963 * \param grp The ECP group the point should belong to.
964 * This must be initialized and have group parameters
965 * set, for example through mbedtls_ecp_group_load().
966 * \param pt The point to check. This must be initialized.
967 *
968 * \return \c 0 if the point is a valid public key.
969 * \return #MBEDTLS_ERR_ECP_INVALID_KEY if the point is not
970 * a valid public key for the given curve.
971 * \return Another negative error code on other kinds of failure.
972 */
973int mbedtls_ecp_check_pubkey( const mbedtls_ecp_group *grp,
974 const mbedtls_ecp_point *pt );
975
976/**
977 * \brief This function checks that an \p mbedtls_mpi is a
978 * valid private key for this curve.
979 *
980 * \note This function uses bare components rather than an
981 * ::mbedtls_ecp_keypair structure to ease use with other
982 * structures, such as ::mbedtls_ecdh_context or
983 * ::mbedtls_ecdsa_context.
984 *
985 * \param grp The ECP group the private key should belong to.
986 * This must be initialized and have group parameters
987 * set, for example through mbedtls_ecp_group_load().
988 * \param d The integer to check. This must be initialized.
989 *
990 * \return \c 0 if the point is a valid private key.
991 * \return #MBEDTLS_ERR_ECP_INVALID_KEY if the point is not a valid
992 * private key for the given curve.
993 * \return Another negative error code on other kinds of failure.
994 */
995int mbedtls_ecp_check_privkey( const mbedtls_ecp_group *grp,
996 const mbedtls_mpi *d );
997
998/**
999 * \brief This function generates a private key.
1000 *
1001 * \param grp The ECP group to generate a private key for.
1002 * This must be initialized and have group parameters
1003 * set, for example through mbedtls_ecp_group_load().
1004 * \param d The destination MPI (secret part). This must be initialized.
1005 * \param f_rng The RNG function. This must not be \c NULL.
1006 * \param p_rng The RNG parameter to be passed to \p f_rng. This may be
1007 * \c NULL if \p f_rng doesn't need a context argument.
1008 *
1009 * \return \c 0 on success.
1010 * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX error code
1011 * on failure.
1012 */
1013int mbedtls_ecp_gen_privkey( const mbedtls_ecp_group *grp,
1014 mbedtls_mpi *d,
1015 int (*f_rng)(void *, unsigned char *, size_t),
1016 void *p_rng );
1017
1018/**
1019 * \brief This function generates a keypair with a configurable base
1020 * point.
1021 *
1022 * \note This function uses bare components rather than an
1023 * ::mbedtls_ecp_keypair structure to ease use with other
1024 * structures, such as ::mbedtls_ecdh_context or
1025 * ::mbedtls_ecdsa_context.
1026 *
1027 * \param grp The ECP group to generate a key pair for.
1028 * This must be initialized and have group parameters
1029 * set, for example through mbedtls_ecp_group_load().
1030 * \param G The base point to use. This must be initialized
1031 * and belong to \p grp. It replaces the default base
1032 * point \c grp->G used by mbedtls_ecp_gen_keypair().
1033 * \param d The destination MPI (secret part).
1034 * This must be initialized.
1035 * \param Q The destination point (public part).
1036 * This must be initialized.
1037 * \param f_rng The RNG function. This must not be \c NULL.
1038 * \param p_rng The RNG context to be passed to \p f_rng. This may
1039 * be \c NULL if \p f_rng doesn't need a context argument.
1040 *
1041 * \return \c 0 on success.
1042 * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX error code
1043 * on failure.
1044 */
1045int mbedtls_ecp_gen_keypair_base( mbedtls_ecp_group *grp,
1046 const mbedtls_ecp_point *G,
1047 mbedtls_mpi *d, mbedtls_ecp_point *Q,
1048 int (*f_rng)(void *, unsigned char *, size_t),
1049 void *p_rng );
1050
1051/**
1052 * \brief This function generates an ECP keypair.
1053 *
1054 * \note This function uses bare components rather than an
1055 * ::mbedtls_ecp_keypair structure to ease use with other
1056 * structures, such as ::mbedtls_ecdh_context or
1057 * ::mbedtls_ecdsa_context.
1058 *
1059 * \param grp The ECP group to generate a key pair for.
1060 * This must be initialized and have group parameters
1061 * set, for example through mbedtls_ecp_group_load().
1062 * \param d The destination MPI (secret part).
1063 * This must be initialized.
1064 * \param Q The destination point (public part).
1065 * This must be initialized.
1066 * \param f_rng The RNG function. This must not be \c NULL.
1067 * \param p_rng The RNG context to be passed to \p f_rng. This may
1068 * be \c NULL if \p f_rng doesn't need a context argument.
1069 *
1070 * \return \c 0 on success.
1071 * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX error code
1072 * on failure.
1073 */
1074int mbedtls_ecp_gen_keypair( mbedtls_ecp_group *grp, mbedtls_mpi *d,
1075 mbedtls_ecp_point *Q,
1076 int (*f_rng)(void *, unsigned char *, size_t),
1077 void *p_rng );
1078
1079/**
1080 * \brief This function generates an ECP key.
1081 *
1082 * \param grp_id The ECP group identifier.
1083 * \param key The destination key. This must be initialized.
1084 * \param f_rng The RNG function to use. This must not be \c NULL.
1085 * \param p_rng The RNG context to be passed to \p f_rng. This may
1086 * be \c NULL if \p f_rng doesn't need a context argument.
1087 *
1088 * \return \c 0 on success.
1089 * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX error code
1090 * on failure.
1091 */
1092int mbedtls_ecp_gen_key( mbedtls_ecp_group_id grp_id, mbedtls_ecp_keypair *key,
1093 int (*f_rng)(void *, unsigned char *, size_t),
1094 void *p_rng );
1095
1096/**
1097 * \brief This function checks that the keypair objects
1098 * \p pub and \p prv have the same group and the
1099 * same public point, and that the private key in
1100 * \p prv is consistent with the public key.
1101 *
1102 * \param pub The keypair structure holding the public key. This
1103 * must be initialized. If it contains a private key, that
1104 * part is ignored.
1105 * \param prv The keypair structure holding the full keypair.
1106 * This must be initialized.
1107 *
1108 * \return \c 0 on success, meaning that the keys are valid and match.
1109 * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if the keys are invalid or do not match.
1110 * \return An \c MBEDTLS_ERR_ECP_XXX or an \c MBEDTLS_ERR_MPI_XXX
1111 * error code on calculation failure.
1112 */
1113int mbedtls_ecp_check_pub_priv( const mbedtls_ecp_keypair *pub,
1114 const mbedtls_ecp_keypair *prv );
1115
1116#if defined(MBEDTLS_SELF_TEST)
1117
1118/**
1119 * \brief The ECP checkup routine.
1120 *
1121 * \return \c 0 on success.
1122 * \return \c 1 on failure.
1123 */
1124int mbedtls_ecp_self_test( int verbose );
1125
1126#endif /* MBEDTLS_SELF_TEST */
1127
1128#ifdef __cplusplus
1129}
1130#endif
1131
1132#endif /* ecp.h */
Note: See TracBrowser for help on using the repository browser.