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 #ifndef MBEDTLS_PK_H
00051 #define MBEDTLS_PK_H
00052
00053 #if !defined(MBEDTLS_CONFIG_FILE)
00054 #include "config.h"
00055 #else
00056 #include MBEDTLS_CONFIG_FILE
00057 #endif
00058
00059 #include "md.h"
00060
00061 #if defined(MBEDTLS_RSA_C)
00062 #include "rsa.h"
00063 #endif
00064
00065 #if defined(MBEDTLS_ECP_C)
00066 #include "ecp.h"
00067 #endif
00068
00069 #if defined(MBEDTLS_ECDSA_C)
00070 #include "ecdsa.h"
00071 #endif
00072
00073 #if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \
00074 !defined(inline) && !defined(__cplusplus)
00075 #define inline __inline
00076 #endif
00077
00078 #define MBEDTLS_ERR_PK_ALLOC_FAILED -0x3F80
00079 #define MBEDTLS_ERR_PK_TYPE_MISMATCH -0x3F00
00080 #define MBEDTLS_ERR_PK_BAD_INPUT_DATA -0x3E80
00081 #define MBEDTLS_ERR_PK_FILE_IO_ERROR -0x3E00
00082 #define MBEDTLS_ERR_PK_KEY_INVALID_VERSION -0x3D80
00083 #define MBEDTLS_ERR_PK_KEY_INVALID_FORMAT -0x3D00
00084 #define MBEDTLS_ERR_PK_UNKNOWN_PK_ALG -0x3C80
00085 #define MBEDTLS_ERR_PK_PASSWORD_REQUIRED -0x3C00
00086 #define MBEDTLS_ERR_PK_PASSWORD_MISMATCH -0x3B80
00087 #define MBEDTLS_ERR_PK_INVALID_PUBKEY -0x3B00
00088 #define MBEDTLS_ERR_PK_INVALID_ALG -0x3A80
00089 #define MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE -0x3A00
00090 #define MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE -0x3980
00091 #define MBEDTLS_ERR_PK_SIG_LEN_MISMATCH -0x3900
00092 #define MBEDTLS_ERR_PK_HW_ACCEL_FAILED -0x3880
00094 #ifdef __cplusplus
00095 extern "C" {
00096 #endif
00097
00101 typedef enum {
00102 MBEDTLS_PK_NONE=0,
00103 MBEDTLS_PK_RSA,
00104 MBEDTLS_PK_ECKEY,
00105 MBEDTLS_PK_ECKEY_DH,
00106 MBEDTLS_PK_ECDSA,
00107 MBEDTLS_PK_RSA_ALT,
00108 MBEDTLS_PK_RSASSA_PSS,
00109 } mbedtls_pk_type_t;
00110
00115 typedef struct
00116 {
00117 mbedtls_md_type_t mgf1_hash_id;
00118 int expected_salt_len;
00119
00120 } mbedtls_pk_rsassa_pss_options;
00121
00125 typedef enum
00126 {
00127 MBEDTLS_PK_DEBUG_NONE = 0,
00128 MBEDTLS_PK_DEBUG_MPI,
00129 MBEDTLS_PK_DEBUG_ECP,
00130 } mbedtls_pk_debug_type;
00131
00135 typedef struct
00136 {
00137 mbedtls_pk_debug_type type;
00138 const char *name;
00139 void *value;
00140 } mbedtls_pk_debug_item;
00141
00143 #define MBEDTLS_PK_DEBUG_MAX_ITEMS 3
00144
00148 typedef struct mbedtls_pk_info_t mbedtls_pk_info_t;
00149
00153 typedef struct
00154 {
00155 const mbedtls_pk_info_t * pk_info;
00156 void * pk_ctx;
00157 } mbedtls_pk_context;
00158
00159 #if defined(MBEDTLS_RSA_C)
00160
00166 static inline mbedtls_rsa_context *mbedtls_pk_rsa( const mbedtls_pk_context pk )
00167 {
00168 return( (mbedtls_rsa_context *) (pk).pk_ctx );
00169 }
00170 #endif
00171
00172 #if defined(MBEDTLS_ECP_C)
00173
00179 static inline mbedtls_ecp_keypair *mbedtls_pk_ec( const mbedtls_pk_context pk )
00180 {
00181 return( (mbedtls_ecp_keypair *) (pk).pk_ctx );
00182 }
00183 #endif
00184
00185 #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT)
00186
00189 typedef int (*mbedtls_pk_rsa_alt_decrypt_func)( void *ctx, int mode, size_t *olen,
00190 const unsigned char *input, unsigned char *output,
00191 size_t output_max_len );
00192 typedef int (*mbedtls_pk_rsa_alt_sign_func)( void *ctx,
00193 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
00194 int mode, mbedtls_md_type_t md_alg, unsigned int hashlen,
00195 const unsigned char *hash, unsigned char *sig );
00196 typedef size_t (*mbedtls_pk_rsa_alt_key_len_func)( void *ctx );
00197 #endif
00198
00206 const mbedtls_pk_info_t *mbedtls_pk_info_from_type( mbedtls_pk_type_t pk_type );
00207
00211 void mbedtls_pk_init( mbedtls_pk_context *ctx );
00212
00216 void mbedtls_pk_free( mbedtls_pk_context *ctx );
00217
00232 int mbedtls_pk_setup( mbedtls_pk_context *ctx, const mbedtls_pk_info_t *info );
00233
00234 #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT)
00235
00249 int mbedtls_pk_setup_rsa_alt( mbedtls_pk_context *ctx, void * key,
00250 mbedtls_pk_rsa_alt_decrypt_func decrypt_func,
00251 mbedtls_pk_rsa_alt_sign_func sign_func,
00252 mbedtls_pk_rsa_alt_key_len_func key_len_func );
00253 #endif
00254
00262 size_t mbedtls_pk_get_bitlen( const mbedtls_pk_context *ctx );
00263
00270 static inline size_t mbedtls_pk_get_len( const mbedtls_pk_context *ctx )
00271 {
00272 return( ( mbedtls_pk_get_bitlen( ctx ) + 7 ) / 8 );
00273 }
00274
00284 int mbedtls_pk_can_do( const mbedtls_pk_context *ctx, mbedtls_pk_type_t type );
00285
00310 int mbedtls_pk_verify( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg,
00311 const unsigned char *hash, size_t hash_len,
00312 const unsigned char *sig, size_t sig_len );
00313
00343 int mbedtls_pk_verify_ext( mbedtls_pk_type_t type, const void *options,
00344 mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg,
00345 const unsigned char *hash, size_t hash_len,
00346 const unsigned char *sig, size_t sig_len );
00347
00376 int mbedtls_pk_sign( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg,
00377 const unsigned char *hash, size_t hash_len,
00378 unsigned char *sig, size_t *sig_len,
00379 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
00380
00397 int mbedtls_pk_decrypt( mbedtls_pk_context *ctx,
00398 const unsigned char *input, size_t ilen,
00399 unsigned char *output, size_t *olen, size_t osize,
00400 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
00401
00418 int mbedtls_pk_encrypt( mbedtls_pk_context *ctx,
00419 const unsigned char *input, size_t ilen,
00420 unsigned char *output, size_t *olen, size_t osize,
00421 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
00422
00431 int mbedtls_pk_check_pair( const mbedtls_pk_context *pub, const mbedtls_pk_context *prv );
00432
00441 int mbedtls_pk_debug( const mbedtls_pk_context *ctx, mbedtls_pk_debug_item *items );
00442
00450 const char * mbedtls_pk_get_name( const mbedtls_pk_context *ctx );
00451
00459 mbedtls_pk_type_t mbedtls_pk_get_type( const mbedtls_pk_context *ctx );
00460
00461 #if defined(MBEDTLS_PK_PARSE_C)
00462
00481 int mbedtls_pk_parse_key( mbedtls_pk_context *ctx,
00482 const unsigned char *key, size_t keylen,
00483 const unsigned char *pwd, size_t pwdlen );
00484
00502 int mbedtls_pk_parse_public_key( mbedtls_pk_context *ctx,
00503 const unsigned char *key, size_t keylen );
00504
00505 #if defined(MBEDTLS_FS_IO)
00506
00522 int mbedtls_pk_parse_keyfile( mbedtls_pk_context *ctx,
00523 const char *path, const char *password );
00524
00541 int mbedtls_pk_parse_public_keyfile( mbedtls_pk_context *ctx, const char *path );
00542 #endif
00543 #endif
00544
00545 #if defined(MBEDTLS_PK_WRITE_C)
00546
00559 int mbedtls_pk_write_key_der( mbedtls_pk_context *ctx, unsigned char *buf, size_t size );
00560
00574 int mbedtls_pk_write_pubkey_der( mbedtls_pk_context *ctx, unsigned char *buf, size_t size );
00575
00576 #if defined(MBEDTLS_PEM_WRITE_C)
00577
00586 int mbedtls_pk_write_pubkey_pem( mbedtls_pk_context *ctx, unsigned char *buf, size_t size );
00587
00597 int mbedtls_pk_write_key_pem( mbedtls_pk_context *ctx, unsigned char *buf, size_t size );
00598 #endif
00599 #endif
00600
00601
00602
00603
00604
00605
00606 #if defined(MBEDTLS_PK_PARSE_C)
00607
00616 int mbedtls_pk_parse_subpubkey( unsigned char **p, const unsigned char *end,
00617 mbedtls_pk_context *pk );
00618 #endif
00619
00620 #if defined(MBEDTLS_PK_WRITE_C)
00621
00631 int mbedtls_pk_write_pubkey( unsigned char **p, unsigned char *start,
00632 const mbedtls_pk_context *key );
00633 #endif
00634
00635
00636
00637
00638
00639 #if defined(MBEDTLS_FS_IO)
00640 int mbedtls_pk_load_file( const char *path, unsigned char **buf, size_t *n );
00641 #endif
00642
00643 #ifdef __cplusplus
00644 }
00645 #endif
00646
00647 #endif