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 #ifndef MBEDTLS_ECP_H
00050 #define MBEDTLS_ECP_H
00051
00052 #if !defined(MBEDTLS_CONFIG_FILE)
00053 #include "config.h"
00054 #else
00055 #include MBEDTLS_CONFIG_FILE
00056 #endif
00057
00058 #include "bignum.h"
00059
00060
00061
00062
00063 #define MBEDTLS_ERR_ECP_BAD_INPUT_DATA -0x4F80
00064 #define MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL -0x4F00
00065 #define MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE -0x4E80
00066 #define MBEDTLS_ERR_ECP_VERIFY_FAILED -0x4E00
00067 #define MBEDTLS_ERR_ECP_ALLOC_FAILED -0x4D80
00068 #define MBEDTLS_ERR_ECP_RANDOM_FAILED -0x4D00
00069 #define MBEDTLS_ERR_ECP_INVALID_KEY -0x4C80
00070 #define MBEDTLS_ERR_ECP_SIG_LEN_MISMATCH -0x4C00
00071 #define MBEDTLS_ERR_ECP_HW_ACCEL_FAILED -0x4B80
00073 #if !defined(MBEDTLS_ECP_ALT)
00074
00075
00076
00077
00078
00079
00080
00081
00082 #ifdef __cplusplus
00083 extern "C" {
00084 #endif
00085
00095 typedef enum
00096 {
00097 MBEDTLS_ECP_DP_NONE = 0,
00098 MBEDTLS_ECP_DP_SECP192R1,
00099 MBEDTLS_ECP_DP_SECP224R1,
00100 MBEDTLS_ECP_DP_SECP256R1,
00101 MBEDTLS_ECP_DP_SECP384R1,
00102 MBEDTLS_ECP_DP_SECP521R1,
00103 MBEDTLS_ECP_DP_BP256R1,
00104 MBEDTLS_ECP_DP_BP384R1,
00105 MBEDTLS_ECP_DP_BP512R1,
00106 MBEDTLS_ECP_DP_CURVE25519,
00107 MBEDTLS_ECP_DP_SECP192K1,
00108 MBEDTLS_ECP_DP_SECP224K1,
00109 MBEDTLS_ECP_DP_SECP256K1,
00110 } mbedtls_ecp_group_id;
00111
00117 #define MBEDTLS_ECP_DP_MAX 12
00118
00122 typedef struct
00123 {
00124 mbedtls_ecp_group_id grp_id;
00125 uint16_t tls_id;
00126 uint16_t bit_size;
00127 const char *name;
00128 } mbedtls_ecp_curve_info;
00129
00139 typedef struct
00140 {
00141 mbedtls_mpi X;
00142 mbedtls_mpi Y;
00143 mbedtls_mpi Z;
00144 }
00145 mbedtls_ecp_point;
00146
00171 typedef struct
00172 {
00173 mbedtls_ecp_group_id id;
00174 mbedtls_mpi P;
00175 mbedtls_mpi A;
00176 mbedtls_mpi B;
00177 mbedtls_ecp_point G;
00178 mbedtls_mpi N;
00179 size_t pbits;
00180 size_t nbits;
00181 unsigned int h;
00182 int (*modp)(mbedtls_mpi *);
00183 int (*t_pre)(mbedtls_ecp_point *, void *);
00184 int (*t_post)(mbedtls_ecp_point *, void *);
00185 void *t_data;
00186 mbedtls_ecp_point *T;
00187 size_t T_size;
00188 }
00189 mbedtls_ecp_group;
00190
00198 typedef struct
00199 {
00200 mbedtls_ecp_group grp;
00201 mbedtls_mpi d;
00202 mbedtls_ecp_point Q;
00203 }
00204 mbedtls_ecp_keypair;
00205
00214 #if !defined(MBEDTLS_ECP_MAX_BITS)
00215
00218 #define MBEDTLS_ECP_MAX_BITS 521
00219 #endif
00220
00221 #define MBEDTLS_ECP_MAX_BYTES ( ( MBEDTLS_ECP_MAX_BITS + 7 ) / 8 )
00222 #define MBEDTLS_ECP_MAX_PT_LEN ( 2 * MBEDTLS_ECP_MAX_BYTES + 1 )
00223
00224 #if !defined(MBEDTLS_ECP_WINDOW_SIZE)
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245 #define MBEDTLS_ECP_WINDOW_SIZE 6
00246 #endif
00247
00248 #if !defined(MBEDTLS_ECP_FIXED_POINT_OPTIM)
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260 #define MBEDTLS_ECP_FIXED_POINT_OPTIM 1
00261 #endif
00262
00263
00264
00265
00266
00267
00268 #define MBEDTLS_ECP_PF_UNCOMPRESSED 0
00269 #define MBEDTLS_ECP_PF_COMPRESSED 1
00271
00272
00273
00274 #define MBEDTLS_ECP_TLS_NAMED_CURVE 3
00282 const mbedtls_ecp_curve_info *mbedtls_ecp_curve_list( void );
00283
00291 const mbedtls_ecp_group_id *mbedtls_ecp_grp_id_list( void );
00292
00300 const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_grp_id( mbedtls_ecp_group_id grp_id );
00301
00309 const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_tls_id( uint16_t tls_id );
00310
00318 const mbedtls_ecp_curve_info *mbedtls_ecp_curve_info_from_name( const char *name );
00319
00323 void mbedtls_ecp_point_init( mbedtls_ecp_point *pt );
00324
00328 void mbedtls_ecp_group_init( mbedtls_ecp_group *grp );
00329
00333 void mbedtls_ecp_keypair_init( mbedtls_ecp_keypair *key );
00334
00338 void mbedtls_ecp_point_free( mbedtls_ecp_point *pt );
00339
00343 void mbedtls_ecp_group_free( mbedtls_ecp_group *grp );
00344
00348 void mbedtls_ecp_keypair_free( mbedtls_ecp_keypair *key );
00349
00359 int mbedtls_ecp_copy( mbedtls_ecp_point *P, const mbedtls_ecp_point *Q );
00360
00370 int mbedtls_ecp_group_copy( mbedtls_ecp_group *dst, const mbedtls_ecp_group *src );
00371
00380 int mbedtls_ecp_set_zero( mbedtls_ecp_point *pt );
00381
00389 int mbedtls_ecp_is_zero( mbedtls_ecp_point *pt );
00390
00403 int mbedtls_ecp_point_cmp( const mbedtls_ecp_point *P,
00404 const mbedtls_ecp_point *Q );
00405
00416 int mbedtls_ecp_point_read_string( mbedtls_ecp_point *P, int radix,
00417 const char *x, const char *y );
00418
00433 int mbedtls_ecp_point_write_binary( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *P,
00434 int format, size_t *olen,
00435 unsigned char *buf, size_t buflen );
00436
00455 int mbedtls_ecp_point_read_binary( const mbedtls_ecp_group *grp, mbedtls_ecp_point *P,
00456 const unsigned char *buf, size_t ilen );
00457
00472 int mbedtls_ecp_tls_read_point( const mbedtls_ecp_group *grp, mbedtls_ecp_point *pt,
00473 const unsigned char **buf, size_t len );
00474
00489 int mbedtls_ecp_tls_write_point( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt,
00490 int format, size_t *olen,
00491 unsigned char *buf, size_t blen );
00492
00506 int mbedtls_ecp_group_load( mbedtls_ecp_group *grp, mbedtls_ecp_group_id id );
00507
00521 int mbedtls_ecp_tls_read_group( mbedtls_ecp_group *grp, const unsigned char **buf, size_t len );
00522
00534 int mbedtls_ecp_tls_write_group( const mbedtls_ecp_group *grp, size_t *olen,
00535 unsigned char *buf, size_t blen );
00536
00566 int mbedtls_ecp_mul( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
00567 const mbedtls_mpi *m, const mbedtls_ecp_point *P,
00568 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
00569
00590 int mbedtls_ecp_muladd( mbedtls_ecp_group *grp, mbedtls_ecp_point *R,
00591 const mbedtls_mpi *m, const mbedtls_ecp_point *P,
00592 const mbedtls_mpi *n, const mbedtls_ecp_point *Q );
00593
00615 int mbedtls_ecp_check_pubkey( const mbedtls_ecp_group *grp, const mbedtls_ecp_point *pt );
00616
00630 int mbedtls_ecp_check_privkey( const mbedtls_ecp_group *grp, const mbedtls_mpi *d );
00631
00643 int mbedtls_ecp_gen_privkey( const mbedtls_ecp_group *grp,
00644 mbedtls_mpi *d,
00645 int (*f_rng)(void *, unsigned char *, size_t),
00646 void *p_rng );
00647
00665 int mbedtls_ecp_gen_keypair_base( mbedtls_ecp_group *grp,
00666 const mbedtls_ecp_point *G,
00667 mbedtls_mpi *d, mbedtls_ecp_point *Q,
00668 int (*f_rng)(void *, unsigned char *, size_t),
00669 void *p_rng );
00670
00687 int mbedtls_ecp_gen_keypair( mbedtls_ecp_group *grp, mbedtls_mpi *d, mbedtls_ecp_point *Q,
00688 int (*f_rng)(void *, unsigned char *, size_t),
00689 void *p_rng );
00690
00702 int mbedtls_ecp_gen_key( mbedtls_ecp_group_id grp_id, mbedtls_ecp_keypair *key,
00703 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
00704
00715 int mbedtls_ecp_check_pub_priv( const mbedtls_ecp_keypair *pub, const mbedtls_ecp_keypair *prv );
00716
00717 #if defined(MBEDTLS_SELF_TEST)
00718
00724 int mbedtls_ecp_self_test( int verbose );
00725
00726 #endif
00727
00728 #ifdef __cplusplus
00729 }
00730 #endif
00731
00732 #else
00733 #include "ecp_alt.h"
00734 #endif
00735
00736 #endif