ecp.h

Go to the documentation of this file.
00001 
00023 #ifndef MBEDTLS_ECP_H
00024 #define MBEDTLS_ECP_H
00025 
00026 #include "bignum.h"
00027 
00028 /*
00029  * ECP error codes
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  * Maximum "window" size used for point multiplication.
00185  * Default: 6.
00186  * Minimum value: 2. Maximum value: 7.
00187  *
00188  * Result is an array of at most ( 1 << ( MBEDTLS_ECP_WINDOW_SIZE - 1 ) )
00189  * points used for point multiplication. This value is directly tied to EC
00190  * peak memory usage, so decreasing it by one should roughly cut memory usage
00191  * by two (if large curves are in use).
00192  *
00193  * Reduction in size may reduce speed, but larger curves are impacted first.
00194  * Sample performances (in ECDHE handshakes/s, with FIXED_POINT_OPTIM = 1):
00195  *      w-size:     6       5       4       3       2
00196  *      521       145     141     135     120      97
00197  *      384       214     209     198     177     146
00198  *      256       320     320     303     262     226
00199 
00200  *      224       475     475     453     398     342
00201  *      192       640     640     633     587     476
00202  */
00203 #define MBEDTLS_ECP_WINDOW_SIZE    6   
00204 #endif /* MBEDTLS_ECP_WINDOW_SIZE */
00205 
00206 #if !defined(MBEDTLS_ECP_FIXED_POINT_OPTIM)
00207 /*
00208  * Trade memory for speed on fixed-point multiplication.
00209  *
00210  * This speeds up repeated multiplication of the generator (that is, the
00211  * multiplication in ECDSA signatures, and half of the multiplications in
00212  * ECDSA verification and ECDHE) by a factor roughly 3 to 4.
00213  *
00214  * The cost is increasing EC peak memory usage by a factor roughly 2.
00215  *
00216  * Change this value to 0 to reduce peak memory usage.
00217  */
00218 #define MBEDTLS_ECP_FIXED_POINT_OPTIM  1   
00219 #endif /* MBEDTLS_ECP_FIXED_POINT_OPTIM */
00220 
00221 /* \} name SECTION: Module settings */
00222 
00223 /*
00224  * Point formats, from RFC 4492's enum ECPointFormat
00225  */
00226 #define MBEDTLS_ECP_PF_UNCOMPRESSED    0   
00227 #define MBEDTLS_ECP_PF_COMPRESSED      1   
00229 /*
00230  * Some other constants from RFC 4492
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 /* ecp.h */

Generated on 11 Mar 2017 for mbed TLS v2.4.2 by  doxygen 1.4.7