00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef MBEDTLS_ECP_H
00025 #define MBEDTLS_ECP_H
00026
00027 #if !defined(MBEDTLS_CONFIG_FILE)
00028 #include "config.h"
00029 #else
00030 #include MBEDTLS_CONFIG_FILE
00031 #endif
00032
00033 #include "bignum.h"
00034
00035
00036
00037
00038 #define MBEDTLS_ERR_ECP_BAD_INPUT_DATA -0x4F80
00039 #define MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL -0x4F00
00040 #define MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE -0x4E80
00041 #define MBEDTLS_ERR_ECP_VERIFY_FAILED -0x4E00
00042 #define MBEDTLS_ERR_ECP_ALLOC_FAILED -0x4D80
00043 #define MBEDTLS_ERR_ECP_RANDOM_FAILED -0x4D00
00044 #define MBEDTLS_ERR_ECP_INVALID_KEY -0x4C80
00045 #define MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH -0x4C00
00046 #define MBEDTLS_ERR_ECP_HW_ACCEL_FAILED -0x4B80
00048 #if !defined(MBEDTLS_ECP_ALT)
00049
00050
00051
00052
00053
00054
00055
00056
00057 #ifdef __cplusplus
00058 extern "C" {
00059 #endif
00060
00070 typedef enum
00071 {
00072 MBEDTLS_ECP_DP_NONE = 0,
00073 MBEDTLS_ECP_DP_SECP192R1,
00074 MBEDTLS_ECP_DP_SECP224R1,
00075 MBEDTLS_ECP_DP_SECP256R1,
00076 MBEDTLS_ECP_DP_SECP384R1,
00077 MBEDTLS_ECP_DP_SECP521R1,
00078 MBEDTLS_ECP_DP_BP256R1,
00079 MBEDTLS_ECP_DP_BP384R1,
00080 MBEDTLS_ECP_DP_BP512R1,
00081 MBEDTLS_ECP_DP_CURVE25519,
00082 MBEDTLS_ECP_DP_SECP192K1,
00083 MBEDTLS_ECP_DP_SECP224K1,
00084 MBEDTLS_ECP_DP_SECP256K1,
00085 } mbedtls_ecp_group_id;
00086
00092 #define MBEDTLS_ECP_DP_MAX 12
00093
00097 typedef struct
00098 {
00099 mbedtls_ecp_group_id grp_id;
00100 uint16_t tls_id;
00101 uint16_t bit_size;
00102 const char *name;
00103 } mbedtls_ecp_curve_info;
00104
00114 typedef struct
00115 {
00116 mbedtls_mpi X;
00117 mbedtls_mpi Y;
00118 mbedtls_mpi Z;
00119 }
00120 mbedtls_ecp_point;
00121
00146 typedef struct
00147 {
00148 mbedtls_ecp_group_id id;
00149 mbedtls_mpi P;
00150 mbedtls_mpi A;
00151 mbedtls_mpi B;
00152 mbedtls_ecp_point G;
00153 mbedtls_mpi N;
00154 size_t pbits;
00155 size_t nbits;
00156 unsigned int h;
00157 int (*modp)(mbedtls_mpi *);
00158 int (*t_pre)(mbedtls_ecp_point *, void *);
00159 int (*t_post)(mbedtls_ecp_point *, void *);
00160 void *t_data;
00161 mbedtls_ecp_point *T;
00162 size_t T_size;
00163 }
00164 mbedtls_ecp_group;
00165
00173 typedef struct
00174 {
00175 mbedtls_ecp_group grp;
00176 mbedtls_mpi d;
00177 mbedtls_ecp_point Q;
00178 }
00179 mbedtls_ecp_keypair;
00180
00189 #if !defined(MBEDTLS_ECP_MAX_BITS)
00190
00193 #define MBEDTLS_ECP_MAX_BITS 521
00194 #endif
00195
00196 #define MBEDTLS_ECP_MAX_BYTES ( ( MBEDTLS_ECP_MAX_BITS + 7 ) / 8 )
00197 #define MBEDTLS_ECP_MAX_PT_LEN ( 2 * MBEDTLS_ECP_MAX_BYTES + 1 )
00198
00199 #if !defined(MBEDTLS_ECP_WINDOW_SIZE)
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220 #define MBEDTLS_ECP_WINDOW_SIZE 6
00221 #endif
00222
00223 #if !defined(MBEDTLS_ECP_FIXED_POINT_OPTIM)
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235 #define MBEDTLS_ECP_FIXED_POINT_OPTIM 1
00236 #endif
00237
00238
00239
00240
00241
00242
00243 #define MBEDTLS_ECP_PF_UNCOMPRESSED 0
00244 #define MBEDTLS_ECP_PF_COMPRESSED 1
00246
00247
00248
00249 #define MBEDTLS_ECP_TLS_NAMED_CURVE 3
00257 const mbedtls_ecp_curve_info *mbedtls_ecp_curve_list( void );
00258
00266 const mbedtls_ecp_group_id *mbedtls_ecp_grp_id_list( void );
00267
00275 const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_grp_id( mbedtls_ecp_group_id grp_id );
00276
00284 const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_tls_id( uint16_t tls_id );
00285
00293 const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_name( const char *name );
00294
00298 void mbedtls_ecp_point_init( mbedtls_ecp_point *pt );
00299
00303 void mbedtls_ecp_group_init( mbedtls_ecp_group *grp );
00304
00308 void mbedtls_ecp_keypair_init( mbedtls_ecp_keypair *key );
00309
00313 void mbedtls_ecp_point_free( mbedtls_ecp_point *pt );
00314
00318 void mbedtls_ecp_group_free( mbedtls_ecp_group *grp );
00319
00323 void mbedtls_ecp_keypair_free( mbedtls_ecp_keypair *key );
00324
00334 int mbedtls_ecp_copy( mbedtls_ecp_point *P, const mbedtls_ecp_point *Q );
00335
00345 int mbedtls_ecp_group_copy( mbedtls_ecp_group *dst, const mbedtls_ecp_group *src );
00346
00355 int mbedtls_ecp_set_zero( mbedtls_ecp_point *pt );
00356
00364 int mbedtls_ecp_is_zero( mbedtls_ecp_point *pt );
00365
00378 int mbedtls_ecp_point_cmp( const mbedtls_ecp_point *P,
00379 const mbedtls_ecp_point *Q );
00380
00391 int mbedtls_ecp_point_read_string( mbedtls_ecp_point *P, int radix,
00392 const char *x, const char *y );
00393
00408 int mbedtls_ecp_point_write_binary( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *P,
00409 int format, size_t *olen,
00410 unsigned char *buf, size_t buflen );
00411
00430 int mbedtls_ecp_point_read_binary( const mbedtls_ecp_group *grp, mbedtls_ecp_point *P,
00431 const unsigned char *buf, size_t ilen );
00432
00447 int mbedtls_ecp_tls_read_point( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt,
00448 const unsigned char **buf, size_t len );
00449
00464 int mbedtls_ecp_tls_write_point( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt,
00465 int format, size_t *olen,
00466 unsigned char *buf, size_t blen );
00467
00481 int mbedtls_ecp_group_load( mbedtls_ecp_group *grp, mbedtls_ecp_group_id id );
00482
00496 int mbedtls_ecp_tls_read_group( mbedtls_ecp_group *grp, const unsigned char **buf, size_t len );
00497
00509 int mbedtls_ecp_tls_write_group( const mbedtls_ecp_group *grp, size_t *olen,
00510 unsigned char *buf, size_t blen );
00511
00538 int mbedtls_ecp_mul( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
00539 const mbedtls_mpi *m, const mbedtls_ecp_point *P,
00540 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
00541
00562 int mbedtls_ecp_muladd( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
00563 const mbedtls_mpi *m, const mbedtls_ecp_point *P,
00564 const mbedtls_mpi *n, const mbedtls_ecp_point *Q );
00565
00587 int mbedtls_ecp_check_pubkey( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt );
00588
00602 int mbedtls_ecp_check_privkey( const mbedtls_ecp_group *grp, const mbedtls_mpi *d );
00603
00621 int mbedtls_ecp_gen_keypair_base( mbedtls_ecp_group *grp,
00622 const mbedtls_ecp_point *G,
00623 mbedtls_mpi *d, mbedtls_ecp_point *Q,
00624 int (*f_rng)(void *, unsigned char *, size_t),
00625 void *p_rng );
00626
00643 int mbedtls_ecp_gen_keypair( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q,
00644 int (*f_rng)(void *, unsigned char *, size_t),
00645 void *p_rng );
00646
00658 int mbedtls_ecp_gen_key( mbedtls_ecp_group_id grp_id, mbedtls_ecp_keypair *key,
00659 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
00660
00671 int mbedtls_ecp_check_pub_priv( const mbedtls_ecp_keypair *pub, const mbedtls_ecp_keypair *prv );
00672
00673 #if defined(MBEDTLS_SELF_TEST)
00674
00680 int mbedtls_ecp_self_test( int verbose );
00681
00682 #endif
00683
00684 #ifdef __cplusplus
00685 }
00686 #endif
00687
00688 #else
00689 #include "ecp_alt.h"
00690 #endif
00691
00692 #endif