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 #include "bignum.h"
00028
00029
00030
00031
00032 #define MBEDTLS_ERR_ECP_BAD_INPUT_DATA -0x4F80
00033 #define MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL -0x4F00
00034 #define MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE -0x4E80
00035 #define MBEDTLS_ERR_ECP_VERIFY_FAILED -0x4E00
00036 #define MBEDTLS_ERR_ECP_ALLOC_FAILED -0x4D80
00037 #define MBEDTLS_ERR_ECP_RANDOM_FAILED -0x4D00
00038 #define MBEDTLS_ERR_ECP_INVALID_KEY -0x4C80
00039 #define MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH -0x4C00
00040 #define MBEDTLS_ERR_ECP_HW_ACCEL_FAILED -0x4B80
00042 #if !defined(MBEDTLS_ECP_ALT)
00043
00044
00045
00046
00047
00048
00049
00050
00051 #ifdef __cplusplus
00052 extern "C" {
00053 #endif
00054
00064 typedef enum
00065 {
00066 MBEDTLS_ECP_DP_NONE = 0,
00067 MBEDTLS_ECP_DP_SECP192R1,
00068 MBEDTLS_ECP_DP_SECP224R1,
00069 MBEDTLS_ECP_DP_SECP256R1,
00070 MBEDTLS_ECP_DP_SECP384R1,
00071 MBEDTLS_ECP_DP_SECP521R1,
00072 MBEDTLS_ECP_DP_BP256R1,
00073 MBEDTLS_ECP_DP_BP384R1,
00074 MBEDTLS_ECP_DP_BP512R1,
00075 MBEDTLS_ECP_DP_CURVE25519,
00076 MBEDTLS_ECP_DP_SECP192K1,
00077 MBEDTLS_ECP_DP_SECP224K1,
00078 MBEDTLS_ECP_DP_SECP256K1,
00079 } mbedtls_ecp_group_id;
00080
00086 #define MBEDTLS_ECP_DP_MAX 12
00087
00091 typedef struct
00092 {
00093 mbedtls_ecp_group_id grp_id;
00094 uint16_t tls_id;
00095 uint16_t bit_size;
00096 const char *name;
00097 } mbedtls_ecp_curve_info;
00098
00108 typedef struct
00109 {
00110 mbedtls_mpi X;
00111 mbedtls_mpi Y;
00112 mbedtls_mpi Z;
00113 }
00114 mbedtls_ecp_point;
00115
00140 typedef struct
00141 {
00142 mbedtls_ecp_group_id id;
00143 mbedtls_mpi P;
00144 mbedtls_mpi A;
00145 mbedtls_mpi B;
00146 mbedtls_ecp_point G;
00147 mbedtls_mpi N;
00148 size_t pbits;
00149 size_t nbits;
00150 unsigned int h;
00151 int (*modp)(mbedtls_mpi *);
00152 int (*t_pre)(mbedtls_ecp_point *, void *);
00153 int (*t_post)(mbedtls_ecp_point *, void *);
00154 void *t_data;
00155 mbedtls_ecp_point *T;
00156 size_t T_size;
00157 }
00158 mbedtls_ecp_group;
00159
00167 typedef struct
00168 {
00169 mbedtls_ecp_group grp;
00170 mbedtls_mpi d;
00171 mbedtls_ecp_point Q;
00172 }
00173 mbedtls_ecp_keypair;
00174
00183 #if !defined(MBEDTLS_ECP_MAX_BITS)
00184
00187 #define MBEDTLS_ECP_MAX_BITS 521
00188 #endif
00189
00190 #define MBEDTLS_ECP_MAX_BYTES ( ( MBEDTLS_ECP_MAX_BITS + 7 ) / 8 )
00191 #define MBEDTLS_ECP_MAX_PT_LEN ( 2 * MBEDTLS_ECP_MAX_BYTES + 1 )
00192
00193 #if !defined(MBEDTLS_ECP_WINDOW_SIZE)
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214 #define MBEDTLS_ECP_WINDOW_SIZE 6
00215 #endif
00216
00217 #if !defined(MBEDTLS_ECP_FIXED_POINT_OPTIM)
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229 #define MBEDTLS_ECP_FIXED_POINT_OPTIM 1
00230 #endif
00231
00232
00233
00234
00235
00236
00237 #define MBEDTLS_ECP_PF_UNCOMPRESSED 0
00238 #define MBEDTLS_ECP_PF_COMPRESSED 1
00240
00241
00242
00243 #define MBEDTLS_ECP_TLS_NAMED_CURVE 3
00251 const mbedtls_ecp_curve_info *mbedtls_ecp_curve_list( void );
00252
00260 const mbedtls_ecp_group_id *mbedtls_ecp_grp_id_list( void );
00261
00269 const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_grp_id( mbedtls_ecp_group_id grp_id );
00270
00278 const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_tls_id( uint16_t tls_id );
00279
00287 const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_name( const char *name );
00288
00292 void mbedtls_ecp_point_init( mbedtls_ecp_point *pt );
00293
00297 void mbedtls_ecp_group_init( mbedtls_ecp_group *grp );
00298
00302 void mbedtls_ecp_keypair_init( mbedtls_ecp_keypair *key );
00303
00307 void mbedtls_ecp_point_free( mbedtls_ecp_point *pt );
00308
00312 void mbedtls_ecp_group_free( mbedtls_ecp_group *grp );
00313
00317 void mbedtls_ecp_keypair_free( mbedtls_ecp_keypair *key );
00318
00328 int mbedtls_ecp_copy( mbedtls_ecp_point *P, const mbedtls_ecp_point *Q );
00329
00339 int mbedtls_ecp_group_copy( mbedtls_ecp_group *dst, const mbedtls_ecp_group *src );
00340
00349 int mbedtls_ecp_set_zero( mbedtls_ecp_point *pt );
00350
00358 int mbedtls_ecp_is_zero( mbedtls_ecp_point *pt );
00359
00372 int mbedtls_ecp_point_cmp( const mbedtls_ecp_point *P,
00373 const mbedtls_ecp_point *Q );
00374
00385 int mbedtls_ecp_point_read_string( mbedtls_ecp_point *P, int radix,
00386 const char *x, const char *y );
00387
00402 int mbedtls_ecp_point_write_binary( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *P,
00403 int format, size_t *olen,
00404 unsigned char *buf, size_t buflen );
00405
00424 int mbedtls_ecp_point_read_binary( const mbedtls_ecp_group *grp, mbedtls_ecp_point *P,
00425 const unsigned char *buf, size_t ilen );
00426
00441 int mbedtls_ecp_tls_read_point( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt,
00442 const unsigned char **buf, size_t len );
00443
00458 int mbedtls_ecp_tls_write_point( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt,
00459 int format, size_t *olen,
00460 unsigned char *buf, size_t blen );
00461
00475 int mbedtls_ecp_group_load( mbedtls_ecp_group *grp, mbedtls_ecp_group_id id );
00476
00490 int mbedtls_ecp_tls_read_group( mbedtls_ecp_group *grp, const unsigned char **buf, size_t len );
00491
00503 int mbedtls_ecp_tls_write_group( const mbedtls_ecp_group *grp, size_t *olen,
00504 unsigned char *buf, size_t blen );
00505
00532 int mbedtls_ecp_mul( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
00533 const mbedtls_mpi *m, const mbedtls_ecp_point *P,
00534 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
00535
00556 int mbedtls_ecp_muladd( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
00557 const mbedtls_mpi *m, const mbedtls_ecp_point *P,
00558 const mbedtls_mpi *n, const mbedtls_ecp_point *Q );
00559
00581 int mbedtls_ecp_check_pubkey( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt );
00582
00596 int mbedtls_ecp_check_privkey( const mbedtls_ecp_group *grp, const mbedtls_mpi *d );
00597
00615 int mbedtls_ecp_gen_keypair_base( mbedtls_ecp_group *grp,
00616 const mbedtls_ecp_point *G,
00617 mbedtls_mpi *d, mbedtls_ecp_point *Q,
00618 int (*f_rng)(void *, unsigned char *, size_t),
00619 void *p_rng );
00620
00637 int mbedtls_ecp_gen_keypair( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q,
00638 int (*f_rng)(void *, unsigned char *, size_t),
00639 void *p_rng );
00640
00652 int mbedtls_ecp_gen_key( mbedtls_ecp_group_id grp_id, mbedtls_ecp_keypair *key,
00653 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
00654
00665 int mbedtls_ecp_check_pub_priv( const mbedtls_ecp_keypair *pub, const mbedtls_ecp_keypair *prv );
00666
00667 #if defined(MBEDTLS_SELF_TEST)
00668
00674 int mbedtls_ecp_self_test( int verbose );
00675
00676 #endif
00677
00678 #ifdef __cplusplus
00679 }
00680 #endif
00681
00682 #else
00683 #include "ecp_alt.h"
00684 #endif
00685
00686 #endif