00001
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 #ifndef MBEDTLS_ECP_H
00052 #define MBEDTLS_ECP_H
00053
00054 #if !defined(MBEDTLS_CONFIG_FILE)
00055 #include "config.h"
00056 #else
00057 #include MBEDTLS_CONFIG_FILE
00058 #endif
00059
00060 #include "bignum.h"
00061
00062
00063
00064
00065 #define MBEDTLS_ERR_ECP_BAD_INPUT_DATA -0x4F80
00066 #define MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL -0x4F00
00067 #define MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE -0x4E80
00068 #define MBEDTLS_ERR_ECP_VERIFY_FAILED -0x4E00
00069 #define MBEDTLS_ERR_ECP_ALLOC_FAILED -0x4D80
00070 #define MBEDTLS_ERR_ECP_RANDOM_FAILED -0x4D00
00071 #define MBEDTLS_ERR_ECP_INVALID_KEY -0x4C80
00072 #define MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH -0x4C00
00073 #define MBEDTLS_ERR_ECP_HW_ACCEL_FAILED -0x4B80
00075 #if !defined(MBEDTLS_ECP_ALT)
00076
00077
00078
00079
00080
00081
00082
00083
00084 #ifdef __cplusplus
00085 extern "C" {
00086 #endif
00087
00097 typedef enum
00098 {
00099 MBEDTLS_ECP_DP_NONE = 0,
00100 MBEDTLS_ECP_DP_SECP192R1,
00101 MBEDTLS_ECP_DP_SECP224R1,
00102 MBEDTLS_ECP_DP_SECP256R1,
00103 MBEDTLS_ECP_DP_SECP384R1,
00104 MBEDTLS_ECP_DP_SECP521R1,
00105 MBEDTLS_ECP_DP_BP256R1,
00106 MBEDTLS_ECP_DP_BP384R1,
00107 MBEDTLS_ECP_DP_BP512R1,
00108 MBEDTLS_ECP_DP_CURVE25519,
00109 MBEDTLS_ECP_DP_SECP192K1,
00110 MBEDTLS_ECP_DP_SECP224K1,
00111 MBEDTLS_ECP_DP_SECP256K1,
00112 } mbedtls_ecp_group_id;
00113
00119 #define MBEDTLS_ECP_DP_MAX 12
00120
00124 typedef struct
00125 {
00126 mbedtls_ecp_group_id grp_id;
00127 uint16_t tls_id;
00128 uint16_t bit_size;
00129 const char *name;
00130 } mbedtls_ecp_curve_info;
00131
00141 typedef struct
00142 {
00143 mbedtls_mpi X;
00144 mbedtls_mpi Y;
00145 mbedtls_mpi Z;
00146 }
00147 mbedtls_ecp_point;
00148
00173 typedef struct
00174 {
00175 mbedtls_ecp_group_id id;
00176 mbedtls_mpi P;
00177 mbedtls_mpi A;
00178 mbedtls_mpi B;
00179 mbedtls_ecp_point G;
00180 mbedtls_mpi N;
00181 size_t pbits;
00182 size_t nbits;
00183 unsigned int h;
00184 int (*modp)(mbedtls_mpi *);
00185 int (*t_pre)(mbedtls_ecp_point *, void *);
00186 int (*t_post)(mbedtls_ecp_point *, void *);
00187 void *t_data;
00188 mbedtls_ecp_point *T;
00189 size_t T_size;
00190 }
00191 mbedtls_ecp_group;
00192
00200 typedef struct
00201 {
00202 mbedtls_ecp_group grp;
00203 mbedtls_mpi d;
00204 mbedtls_ecp_point Q;
00205 }
00206 mbedtls_ecp_keypair;
00207
00216 #if !defined(MBEDTLS_ECP_MAX_BITS)
00217
00220 #define MBEDTLS_ECP_MAX_BITS 521
00221 #endif
00222
00223 #define MBEDTLS_ECP_MAX_BYTES ( ( MBEDTLS_ECP_MAX_BITS + 7 ) / 8 )
00224 #define MBEDTLS_ECP_MAX_PT_LEN ( 2 * MBEDTLS_ECP_MAX_BYTES + 1 )
00225
00226 #if !defined(MBEDTLS_ECP_WINDOW_SIZE)
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247 #define MBEDTLS_ECP_WINDOW_SIZE 6
00248 #endif
00249
00250 #if !defined(MBEDTLS_ECP_FIXED_POINT_OPTIM)
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262 #define MBEDTLS_ECP_FIXED_POINT_OPTIM 1
00263 #endif
00264
00265
00266
00267
00268
00269
00270 #define MBEDTLS_ECP_PF_UNCOMPRESSED 0
00271 #define MBEDTLS_ECP_PF_COMPRESSED 1
00273
00274
00275
00276 #define MBEDTLS_ECP_TLS_NAMED_CURVE 3
00284 const mbedtls_ecp_curve_info *mbedtls_ecp_curve_list( void );
00285
00293 const mbedtls_ecp_group_id *mbedtls_ecp_grp_id_list( void );
00294
00302 const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_grp_id( mbedtls_ecp_group_id grp_id );
00303
00311 const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_tls_id( uint16_t tls_id );
00312
00320 const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_name( const char *name );
00321
00325 void mbedtls_ecp_point_init( mbedtls_ecp_point *pt );
00326
00330 void mbedtls_ecp_group_init( mbedtls_ecp_group *grp );
00331
00335 void mbedtls_ecp_keypair_init( mbedtls_ecp_keypair *key );
00336
00340 void mbedtls_ecp_point_free( mbedtls_ecp_point *pt );
00341
00345 void mbedtls_ecp_group_free( mbedtls_ecp_group *grp );
00346
00350 void mbedtls_ecp_keypair_free( mbedtls_ecp_keypair *key );
00351
00361 int mbedtls_ecp_copy( mbedtls_ecp_point *P, const mbedtls_ecp_point *Q );
00362
00372 int mbedtls_ecp_group_copy( mbedtls_ecp_group *dst, const mbedtls_ecp_group *src );
00373
00382 int mbedtls_ecp_set_zero( mbedtls_ecp_point *pt );
00383
00391 int mbedtls_ecp_is_zero( mbedtls_ecp_point *pt );
00392
00405 int mbedtls_ecp_point_cmp( const mbedtls_ecp_point *P,
00406 const mbedtls_ecp_point *Q );
00407
00418 int mbedtls_ecp_point_read_string( mbedtls_ecp_point *P, int radix,
00419 const char *x, const char *y );
00420
00435 int mbedtls_ecp_point_write_binary( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *P,
00436 int format, size_t *olen,
00437 unsigned char *buf, size_t buflen );
00438
00457 int mbedtls_ecp_point_read_binary( const mbedtls_ecp_group *grp, mbedtls_ecp_point *P,
00458 const unsigned char *buf, size_t ilen );
00459
00474 int mbedtls_ecp_tls_read_point( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt,
00475 const unsigned char **buf, size_t len );
00476
00491 int mbedtls_ecp_tls_write_point( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt,
00492 int format, size_t *olen,
00493 unsigned char *buf, size_t blen );
00494
00508 int mbedtls_ecp_group_load( mbedtls_ecp_group *grp, mbedtls_ecp_group_id id );
00509
00523 int mbedtls_ecp_tls_read_group( mbedtls_ecp_group *grp, const unsigned char **buf, size_t len );
00524
00536 int mbedtls_ecp_tls_write_group( const mbedtls_ecp_group *grp, size_t *olen,
00537 unsigned char *buf, size_t blen );
00538
00568 int mbedtls_ecp_mul( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
00569 const mbedtls_mpi *m, const mbedtls_ecp_point *P,
00570 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
00571
00592 int mbedtls_ecp_muladd( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
00593 const mbedtls_mpi *m, const mbedtls_ecp_point *P,
00594 const mbedtls_mpi *n, const mbedtls_ecp_point *Q );
00595
00617 int mbedtls_ecp_check_pubkey( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt );
00618
00632 int mbedtls_ecp_check_privkey( const mbedtls_ecp_group *grp, const mbedtls_mpi *d );
00633
00645 int mbedtls_ecp_gen_privkey( const mbedtls_ecp_group *grp,
00646 mbedtls_mpi *d,
00647 int (*f_rng)(void *, unsigned char *, size_t),
00648 void *p_rng );
00649
00667 int mbedtls_ecp_gen_keypair_base( mbedtls_ecp_group *grp,
00668 const mbedtls_ecp_point *G,
00669 mbedtls_mpi *d, mbedtls_ecp_point *Q,
00670 int (*f_rng)(void *, unsigned char *, size_t),
00671 void *p_rng );
00672
00689 int mbedtls_ecp_gen_keypair( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q,
00690 int (*f_rng)(void *, unsigned char *, size_t),
00691 void *p_rng );
00692
00704 int mbedtls_ecp_gen_key( mbedtls_ecp_group_id grp_id, mbedtls_ecp_keypair *key,
00705 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
00706
00717 int mbedtls_ecp_check_pub_priv( const mbedtls_ecp_keypair *pub, const mbedtls_ecp_keypair *prv );
00718
00719 #if defined(MBEDTLS_SELF_TEST)
00720
00726 int mbedtls_ecp_self_test( int verbose );
00727
00728 #endif
00729
00730 #ifdef __cplusplus
00731 }
00732 #endif
00733
00734 #else
00735 #include "ecp_alt.h"
00736 #endif
00737
00738 #endif