00001
00023 #ifndef MBEDTLS_ECP_H
00024 #define MBEDTLS_ECP_H
00025
00026 #include "bignum.h"
00027
00028
00029
00030
00031 #define MBEDTLS_ERR_ECP_BAD_INPUT_DATA -0x4F80
00032 #define MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL -0x4F00
00033 #define MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE -0x4E80
00034 #define MBEDTLS_ERR_ECP_VERIFY_FAILED -0x4E00
00035 #define MBEDTLS_ERR_ECP_ALLOC_FAILED -0x4D80
00036 #define MBEDTLS_ERR_ECP_RANDOM_FAILED -0x4D00
00037 #define MBEDTLS_ERR_ECP_INVALID_KEY -0x4C80
00038 #define MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH -0x4C00
00040 #ifdef __cplusplus
00041 extern "C" {
00042 #endif
00043
00053 typedef enum
00054 {
00055 MBEDTLS_ECP_DP_NONE = 0,
00056 MBEDTLS_ECP_DP_SECP192R1,
00057 MBEDTLS_ECP_DP_SECP224R1,
00058 MBEDTLS_ECP_DP_SECP256R1,
00059 MBEDTLS_ECP_DP_SECP384R1,
00060 MBEDTLS_ECP_DP_SECP521R1,
00061 MBEDTLS_ECP_DP_BP256R1,
00062 MBEDTLS_ECP_DP_BP384R1,
00063 MBEDTLS_ECP_DP_BP512R1,
00064 MBEDTLS_ECP_DP_CURVE25519,
00065 MBEDTLS_ECP_DP_SECP192K1,
00066 MBEDTLS_ECP_DP_SECP224K1,
00067 MBEDTLS_ECP_DP_SECP256K1,
00068 } mbedtls_ecp_group_id;
00069
00075 #define MBEDTLS_ECP_DP_MAX 12
00076
00080 typedef struct
00081 {
00082 mbedtls_ecp_group_id grp_id;
00083 uint16_t tls_id;
00084 uint16_t bit_size;
00085 const char *name;
00086 } mbedtls_ecp_curve_info;
00087
00097 typedef struct
00098 {
00099 mbedtls_mpi X;
00100 mbedtls_mpi Y;
00101 mbedtls_mpi Z;
00102 }
00103 mbedtls_ecp_point;
00104
00129 typedef struct
00130 {
00131 mbedtls_ecp_group_id id;
00132 mbedtls_mpi P;
00133 mbedtls_mpi A;
00134 mbedtls_mpi B;
00135 mbedtls_ecp_point G;
00136 mbedtls_mpi N;
00137 size_t pbits;
00138 size_t nbits;
00139 unsigned int h;
00140 int (*modp)(mbedtls_mpi *);
00141 int (*t_pre)(mbedtls_ecp_point *, void *);
00142 int (*t_post)(mbedtls_ecp_point *, void *);
00143 void *t_data;
00144 mbedtls_ecp_point *T;
00145 size_t T_size;
00146 }
00147 mbedtls_ecp_group;
00148
00156 typedef struct
00157 {
00158 mbedtls_ecp_group grp;
00159 mbedtls_mpi d;
00160 mbedtls_ecp_point Q;
00161 }
00162 mbedtls_ecp_keypair;
00163
00172 #if !defined(MBEDTLS_ECP_MAX_BITS)
00173
00176 #define MBEDTLS_ECP_MAX_BITS 521
00177 #endif
00178
00179 #define MBEDTLS_ECP_MAX_BYTES ( ( MBEDTLS_ECP_MAX_BITS + 7 ) / 8 )
00180 #define MBEDTLS_ECP_MAX_PT_LEN ( 2 * MBEDTLS_ECP_MAX_BYTES + 1 )
00181
00182 #if !defined(MBEDTLS_ECP_WINDOW_SIZE)
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203 #define MBEDTLS_ECP_WINDOW_SIZE 6
00204 #endif
00205
00206 #if !defined(MBEDTLS_ECP_FIXED_POINT_OPTIM)
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218 #define MBEDTLS_ECP_FIXED_POINT_OPTIM 1
00219 #endif
00220
00221
00222
00223
00224
00225
00226 #define MBEDTLS_ECP_PF_UNCOMPRESSED 0
00227 #define MBEDTLS_ECP_PF_COMPRESSED 1
00229
00230
00231
00232 #define MBEDTLS_ECP_TLS_NAMED_CURVE 3
00240 const mbedtls_ecp_curve_info *mbedtls_ecp_curve_list( void );
00241
00249 const mbedtls_ecp_group_id *mbedtls_ecp_grp_id_list( void );
00250
00258 const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_grp_id( mbedtls_ecp_group_id grp_id );
00259
00267 const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_tls_id( uint16_t tls_id );
00268
00276 const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_name( const char *name );
00277
00281 void mbedtls_ecp_point_init( mbedtls_ecp_point *pt );
00282
00286 void mbedtls_ecp_group_init( mbedtls_ecp_group *grp );
00287
00291 void mbedtls_ecp_keypair_init( mbedtls_ecp_keypair *key );
00292
00296 void mbedtls_ecp_point_free( mbedtls_ecp_point *pt );
00297
00301 void mbedtls_ecp_group_free( mbedtls_ecp_group *grp );
00302
00306 void mbedtls_ecp_keypair_free( mbedtls_ecp_keypair *key );
00307
00317 int mbedtls_ecp_copy( mbedtls_ecp_point *P, const mbedtls_ecp_point *Q );
00318
00328 int mbedtls_ecp_group_copy( mbedtls_ecp_group *dst, const mbedtls_ecp_group *src );
00329
00338 int mbedtls_ecp_set_zero( mbedtls_ecp_point *pt );
00339
00347 int mbedtls_ecp_is_zero( mbedtls_ecp_point *pt );
00348
00361 int mbedtls_ecp_point_cmp( const mbedtls_ecp_point *P,
00362 const mbedtls_ecp_point *Q );
00363
00374 int mbedtls_ecp_point_read_string( mbedtls_ecp_point *P, int radix,
00375 const char *x, const char *y );
00376
00391 int mbedtls_ecp_point_write_binary( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *P,
00392 int format, size_t *olen,
00393 unsigned char *buf, size_t buflen );
00394
00413 int mbedtls_ecp_point_read_binary( const mbedtls_ecp_group *grp, mbedtls_ecp_point *P,
00414 const unsigned char *buf, size_t ilen );
00415
00430 int mbedtls_ecp_tls_read_point( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt,
00431 const unsigned char **buf, size_t len );
00432
00447 int mbedtls_ecp_tls_write_point( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt,
00448 int format, size_t *olen,
00449 unsigned char *buf, size_t blen );
00450
00464 int mbedtls_ecp_group_load( mbedtls_ecp_group *grp, mbedtls_ecp_group_id index );
00465
00479 int mbedtls_ecp_tls_read_group( mbedtls_ecp_group *grp, const unsigned char **buf, size_t len );
00480
00492 int mbedtls_ecp_tls_write_group( const mbedtls_ecp_group *grp, size_t *olen,
00493 unsigned char *buf, size_t blen );
00494
00521 int mbedtls_ecp_mul( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
00522 const mbedtls_mpi *m, const mbedtls_ecp_point *P,
00523 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
00524
00545 int mbedtls_ecp_muladd( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
00546 const mbedtls_mpi *m, const mbedtls_ecp_point *P,
00547 const mbedtls_mpi *n, const mbedtls_ecp_point *Q );
00548
00570 int mbedtls_ecp_check_pubkey( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt );
00571
00585 int mbedtls_ecp_check_privkey( const mbedtls_ecp_group *grp, const mbedtls_mpi *d );
00586
00604 int mbedtls_ecp_gen_keypair_base( mbedtls_ecp_group *grp,
00605 const mbedtls_ecp_point *G,
00606 mbedtls_mpi *d, mbedtls_ecp_point *Q,
00607 int (*f_rng)(void *, unsigned char *, size_t),
00608 void *p_rng );
00609
00626 int mbedtls_ecp_gen_keypair( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q,
00627 int (*f_rng)(void *, unsigned char *, size_t),
00628 void *p_rng );
00629
00641 int mbedtls_ecp_gen_key( mbedtls_ecp_group_id grp_id, mbedtls_ecp_keypair *key,
00642 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
00643
00654 int mbedtls_ecp_check_pub_priv( const mbedtls_ecp_keypair *pub, const mbedtls_ecp_keypair *prv );
00655
00656 #if defined(MBEDTLS_SELF_TEST)
00657
00662 int mbedtls_ecp_self_test( int verbose );
00663 #endif
00664
00665 #ifdef __cplusplus
00666 }
00667 #endif
00668
00669 #endif