00001
00024 #ifndef MBEDTLS_PK_H
00025 #define MBEDTLS_PK_H
00026
00027 #if !defined(MBEDTLS_CONFIG_FILE)
00028 #include "config.h"
00029 #else
00030 #include MBEDTLS_CONFIG_FILE
00031 #endif
00032
00033 #include "md.h"
00034
00035 #if defined(MBEDTLS_RSA_C)
00036 #include "rsa.h"
00037 #endif
00038
00039 #if defined(MBEDTLS_ECP_C)
00040 #include "ecp.h"
00041 #endif
00042
00043 #if defined(MBEDTLS_ECDSA_C)
00044 #include "ecdsa.h"
00045 #endif
00046
00047 #if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \
00048 !defined(inline) && !defined(__cplusplus)
00049 #define inline __inline
00050 #endif
00051
00052 #define MBEDTLS_ERR_PK_ALLOC_FAILED -0x3F80
00053 #define MBEDTLS_ERR_PK_TYPE_MISMATCH -0x3F00
00054 #define MBEDTLS_ERR_PK_BAD_INPUT_DATA -0x3E80
00055 #define MBEDTLS_ERR_PK_FILE_IO_ERROR -0x3E00
00056 #define MBEDTLS_ERR_PK_KEY_INVALID_VERSION -0x3D80
00057 #define MBEDTLS_ERR_PK_KEY_INVALID_FORMAT -0x3D00
00058 #define MBEDTLS_ERR_PK_UNKNOWN_PK_ALG -0x3C80
00059 #define MBEDTLS_ERR_PK_PASSWORD_REQUIRED -0x3C00
00060 #define MBEDTLS_ERR_PK_PASSWORD_MISMATCH -0x3B80
00061 #define MBEDTLS_ERR_PK_INVALID_PUBKEY -0x3B00
00062 #define MBEDTLS_ERR_PK_INVALID_ALG -0x3A80
00063 #define MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE -0x3A00
00064 #define MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE -0x3980
00065 #define MBEDTLS_ERR_PK_SIG_LEN_MISMATCH -0x3900
00067 #ifdef __cplusplus
00068 extern "C" {
00069 #endif
00070
00074 typedef enum {
00075 MBEDTLS_PK_NONE=0,
00076 MBEDTLS_PK_RSA,
00077 MBEDTLS_PK_ECKEY,
00078 MBEDTLS_PK_ECKEY_DH,
00079 MBEDTLS_PK_ECDSA,
00080 MBEDTLS_PK_RSA_ALT,
00081 MBEDTLS_PK_RSASSA_PSS,
00082 } mbedtls_pk_type_t;
00083
00088 typedef struct
00089 {
00090 mbedtls_md_type_t mgf1_hash_id;
00091 int expected_salt_len;
00092
00093 } mbedtls_pk_rsassa_pss_options;
00094
00098 typedef enum
00099 {
00100 MBEDTLS_PK_DEBUG_NONE = 0,
00101 MBEDTLS_PK_DEBUG_MPI,
00102 MBEDTLS_PK_DEBUG_ECP,
00103 } mbedtls_pk_debug_type;
00104
00108 typedef struct
00109 {
00110 mbedtls_pk_debug_type type;
00111 const char *name;
00112 void *value;
00113 } mbedtls_pk_debug_item;
00114
00116 #define MBEDTLS_PK_DEBUG_MAX_ITEMS 3
00117
00121 typedef struct mbedtls_pk_info_t mbedtls_pk_info_t;
00122
00126 typedef struct
00127 {
00128 const mbedtls_pk_info_t * pk_info;
00129 void * pk_ctx;
00130 } mbedtls_pk_context;
00131
00132 #if defined(MBEDTLS_RSA_C)
00133
00139 static inline mbedtls_rsa_context *mbedtls_pk_rsa( const mbedtls_pk_context pk )
00140 {
00141 return( (mbedtls_rsa_context *) (pk).pk_ctx );
00142 }
00143 #endif
00144
00145 #if defined(MBEDTLS_ECP_C)
00146
00152 static inline mbedtls_ecp_keypair *mbedtls_pk_ec( const mbedtls_pk_context pk )
00153 {
00154 return( (mbedtls_ecp_keypair *) (pk).pk_ctx );
00155 }
00156 #endif
00157
00158 #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT)
00159
00162 typedef int (*mbedtls_pk_rsa_alt_decrypt_func)( void *ctx, int mode, size_t *olen,
00163 const unsigned char *input, unsigned char *output,
00164 size_t output_max_len );
00165 typedef int (*mbedtls_pk_rsa_alt_sign_func)( void *ctx,
00166 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
00167 int mode, mbedtls_md_type_t md_alg, unsigned int hashlen,
00168 const unsigned char *hash, unsigned char *sig );
00169 typedef size_t (*mbedtls_pk_rsa_alt_key_len_func)( void *ctx );
00170 #endif
00171
00179 const mbedtls_pk_info_t *mbedtls_pk_info_from_type( mbedtls_pk_type_t pk_type );
00180
00184 void mbedtls_pk_init( mbedtls_pk_context *ctx );
00185
00189 void mbedtls_pk_free( mbedtls_pk_context *ctx );
00190
00205 int mbedtls_pk_setup( mbedtls_pk_context *ctx, const mbedtls_pk_info_t *info );
00206
00207 #if defined(MBEDTLS_PK_RSA_ALT_SUPPORT)
00208
00222 int mbedtls_pk_setup_rsa_alt( mbedtls_pk_context *ctx, void * key,
00223 mbedtls_pk_rsa_alt_decrypt_func decrypt_func,
00224 mbedtls_pk_rsa_alt_sign_func sign_func,
00225 mbedtls_pk_rsa_alt_key_len_func key_len_func );
00226 #endif
00227
00235 size_t mbedtls_pk_get_bitlen( const mbedtls_pk_context *ctx );
00236
00243 static inline size_t mbedtls_pk_get_len( const mbedtls_pk_context *ctx )
00244 {
00245 return( ( mbedtls_pk_get_bitlen( ctx ) + 7 ) / 8 );
00246 }
00247
00257 int mbedtls_pk_can_do( const mbedtls_pk_context *ctx, mbedtls_pk_type_t type );
00258
00283 int mbedtls_pk_verify( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg,
00284 const unsigned char *hash, size_t hash_len,
00285 const unsigned char *sig, size_t sig_len );
00286
00316 int mbedtls_pk_verify_ext( mbedtls_pk_type_t type, const void *options,
00317 mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg,
00318 const unsigned char *hash, size_t hash_len,
00319 const unsigned char *sig, size_t sig_len );
00320
00345 int mbedtls_pk_sign( mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg,
00346 const unsigned char *hash, size_t hash_len,
00347 unsigned char *sig, size_t *sig_len,
00348 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
00349
00366 int mbedtls_pk_decrypt( mbedtls_pk_context *ctx,
00367 const unsigned char *input, size_t ilen,
00368 unsigned char *output, size_t *olen, size_t osize,
00369 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
00370
00387 int mbedtls_pk_encrypt( mbedtls_pk_context *ctx,
00388 const unsigned char *input, size_t ilen,
00389 unsigned char *output, size_t *olen, size_t osize,
00390 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
00391
00400 int mbedtls_pk_check_pair( const mbedtls_pk_context *pub, const mbedtls_pk_context *prv );
00401
00410 int mbedtls_pk_debug( const mbedtls_pk_context *ctx, mbedtls_pk_debug_item *items );
00411
00419 const char * mbedtls_pk_get_name( const mbedtls_pk_context *ctx );
00420
00428 mbedtls_pk_type_t mbedtls_pk_get_type( const mbedtls_pk_context *ctx );
00429
00430 #if defined(MBEDTLS_PK_PARSE_C)
00431
00450 int mbedtls_pk_parse_key( mbedtls_pk_context *ctx,
00451 const unsigned char *key, size_t keylen,
00452 const unsigned char *pwd, size_t pwdlen );
00453
00471 int mbedtls_pk_parse_public_key( mbedtls_pk_context *ctx,
00472 const unsigned char *key, size_t keylen );
00473
00474 #if defined(MBEDTLS_FS_IO)
00475
00491 int mbedtls_pk_parse_keyfile( mbedtls_pk_context *ctx,
00492 const char *path, const char *password );
00493
00510 int mbedtls_pk_parse_public_keyfile( mbedtls_pk_context *ctx, const char *path );
00511 #endif
00512 #endif
00513
00514 #if defined(MBEDTLS_PK_WRITE_C)
00515
00528 int mbedtls_pk_write_key_der( mbedtls_pk_context *ctx, unsigned char *buf, size_t size );
00529
00543 int mbedtls_pk_write_pubkey_der( mbedtls_pk_context *ctx, unsigned char *buf, size_t size );
00544
00545 #if defined(MBEDTLS_PEM_WRITE_C)
00546
00555 int mbedtls_pk_write_pubkey_pem( mbedtls_pk_context *ctx, unsigned char *buf, size_t size );
00556
00566 int mbedtls_pk_write_key_pem( mbedtls_pk_context *ctx, unsigned char *buf, size_t size );
00567 #endif
00568 #endif
00569
00570
00571
00572
00573
00574
00575 #if defined(MBEDTLS_PK_PARSE_C)
00576
00585 int mbedtls_pk_parse_subpubkey( unsigned char **p, const unsigned char *end,
00586 mbedtls_pk_context *pk );
00587 #endif
00588
00589 #if defined(MBEDTLS_PK_WRITE_C)
00590
00600 int mbedtls_pk_write_pubkey( unsigned char **p, unsigned char *start,
00601 const mbedtls_pk_context *key );
00602 #endif
00603
00604
00605
00606
00607
00608 #if defined(MBEDTLS_FS_IO)
00609 int mbedtls_pk_load_file( const char *path, unsigned char **buf, size_t *n );
00610 #endif
00611
00612 #ifdef __cplusplus
00613 }
00614 #endif
00615
00616 #endif