PolarSSL v1.3.9
pk.h
Go to the documentation of this file.
1
28#ifndef POLARSSL_PK_H
29#define POLARSSL_PK_H
30
31#if !defined(POLARSSL_CONFIG_FILE)
32#include "config.h"
33#else
34#include POLARSSL_CONFIG_FILE
35#endif
36
37#include "md.h"
38
39#if defined(POLARSSL_RSA_C)
40#include "rsa.h"
41#endif
42
43#if defined(POLARSSL_ECP_C)
44#include "ecp.h"
45#endif
46
47#if defined(POLARSSL_ECDSA_C)
48#include "ecdsa.h"
49#endif
50
51#define POLARSSL_ERR_PK_MALLOC_FAILED -0x2F80
52#define POLARSSL_ERR_PK_TYPE_MISMATCH -0x2F00
53#define POLARSSL_ERR_PK_BAD_INPUT_DATA -0x2E80
54#define POLARSSL_ERR_PK_FILE_IO_ERROR -0x2E00
55#define POLARSSL_ERR_PK_KEY_INVALID_VERSION -0x2D80
56#define POLARSSL_ERR_PK_KEY_INVALID_FORMAT -0x2D00
57#define POLARSSL_ERR_PK_UNKNOWN_PK_ALG -0x2C80
58#define POLARSSL_ERR_PK_PASSWORD_REQUIRED -0x2C00
59#define POLARSSL_ERR_PK_PASSWORD_MISMATCH -0x2B80
60#define POLARSSL_ERR_PK_INVALID_PUBKEY -0x2B00
61#define POLARSSL_ERR_PK_INVALID_ALG -0x2A80
62#define POLARSSL_ERR_PK_UNKNOWN_NAMED_CURVE -0x2A00
63#define POLARSSL_ERR_PK_FEATURE_UNAVAILABLE -0x2980
64#define POLARSSL_ERR_PK_SIG_LEN_MISMATCH -0x2000
67#if defined(POLARSSL_RSA_C)
74#define pk_rsa( pk ) ( (rsa_context *) (pk).pk_ctx )
75#endif /* POLARSSL_RSA_C */
76
77#if defined(POLARSSL_ECP_C)
84#define pk_ec( pk ) ( (ecp_keypair *) (pk).pk_ctx )
85#endif /* POLARSSL_ECP_C */
86
87
88#ifdef __cplusplus
89extern "C" {
90#endif
91
104
115
125
129typedef struct
130{
132 const char *name;
133 void *value;
135
137#define POLARSSL_PK_DEBUG_MAX_ITEMS 3
138
142typedef struct
143{
146
148 const char *name;
149
151 size_t (*get_size)( const void * );
152
154 int (*can_do)( pk_type_t type );
155
157 int (*verify_func)( void *ctx, md_type_t md_alg,
158 const unsigned char *hash, size_t hash_len,
159 const unsigned char *sig, size_t sig_len );
160
162 int (*sign_func)( void *ctx, md_type_t md_alg,
163 const unsigned char *hash, size_t hash_len,
164 unsigned char *sig, size_t *sig_len,
165 int (*f_rng)(void *, unsigned char *, size_t),
166 void *p_rng );
167
169 int (*decrypt_func)( void *ctx, const unsigned char *input, size_t ilen,
170 unsigned char *output, size_t *olen, size_t osize,
171 int (*f_rng)(void *, unsigned char *, size_t),
172 void *p_rng );
173
175 int (*encrypt_func)( void *ctx, const unsigned char *input, size_t ilen,
176 unsigned char *output, size_t *olen, size_t osize,
177 int (*f_rng)(void *, unsigned char *, size_t),
178 void *p_rng );
179
181 void * (*ctx_alloc_func)( void );
182
184 void (*ctx_free_func)( void *ctx );
185
187 void (*debug_func)( const void *ctx, pk_debug_item *items );
188
189} pk_info_t;
190
194typedef struct
195{
197 void * pk_ctx;
198} pk_context;
199
203typedef int (*pk_rsa_alt_decrypt_func)( void *ctx, int mode, size_t *olen,
204 const unsigned char *input, unsigned char *output,
205 size_t output_max_len );
206typedef int (*pk_rsa_alt_sign_func)( void *ctx,
207 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
208 int mode, md_type_t md_alg, unsigned int hashlen,
209 const unsigned char *hash, unsigned char *sig );
210typedef size_t (*pk_rsa_alt_key_len_func)( void *ctx );
211
220
224void pk_init( pk_context *ctx );
225
229void pk_free( pk_context *ctx );
230
245int pk_init_ctx( pk_context *ctx, const pk_info_t *info );
246
261int pk_init_ctx_rsa_alt( pk_context *ctx, void * key,
262 pk_rsa_alt_decrypt_func decrypt_func,
263 pk_rsa_alt_sign_func sign_func,
264 pk_rsa_alt_key_len_func key_len_func );
265
273size_t pk_get_size( const pk_context *ctx );
274
281static inline size_t pk_get_len( const pk_context *ctx )
282{
283 return( ( pk_get_size( ctx ) + 7 ) / 8 );
284}
285
296
322 const unsigned char *hash, size_t hash_len,
323 const unsigned char *sig, size_t sig_len );
324
354int pk_verify_ext( pk_type_t type, const void *options,
355 pk_context *ctx, md_type_t md_alg,
356 const unsigned char *hash, size_t hash_len,
357 const unsigned char *sig, size_t sig_len );
358
382int pk_sign( pk_context *ctx, md_type_t md_alg,
383 const unsigned char *hash, size_t hash_len,
384 unsigned char *sig, size_t *sig_len,
385 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
386
404 const unsigned char *input, size_t ilen,
405 unsigned char *output, size_t *olen, size_t osize,
406 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
407
425 const unsigned char *input, size_t ilen,
426 unsigned char *output, size_t *olen, size_t osize,
427 int (*f_rng)(void *, unsigned char *, size_t), void *p_rng );
428
437int pk_debug( const pk_context *ctx, pk_debug_item *items );
438
446const char * pk_get_name( const pk_context *ctx );
447
456
457#if defined(POLARSSL_PK_PARSE_C)
477 const unsigned char *key, size_t keylen,
478 const unsigned char *pwd, size_t pwdlen );
479
497 const unsigned char *key, size_t keylen );
498
499#if defined(POLARSSL_FS_IO)
517 const char *path, const char *password );
518
534int pk_parse_public_keyfile( pk_context *ctx, const char *path );
535#endif /* POLARSSL_FS_IO */
536#endif /* POLARSSL_PK_PARSE_C */
537
538#if defined(POLARSSL_PK_WRITE_C)
552int pk_write_key_der( pk_context *ctx, unsigned char *buf, size_t size );
553
567int pk_write_pubkey_der( pk_context *ctx, unsigned char *buf, size_t size );
568
569#if defined(POLARSSL_PEM_WRITE_C)
579int pk_write_pubkey_pem( pk_context *ctx, unsigned char *buf, size_t size );
580
590int pk_write_key_pem( pk_context *ctx, unsigned char *buf, size_t size );
591#endif /* POLARSSL_PEM_WRITE_C */
592#endif /* POLARSSL_PK_WRITE_C */
593
594/*
595 * WARNING: Low-level functions. You probably do not want to use these unless
596 * you are certain you do ;)
597 */
598
599#if defined(POLARSSL_PK_PARSE_C)
609int pk_parse_subpubkey( unsigned char **p, const unsigned char *end,
610 pk_context *pk );
611#endif /* POLARSSL_PK_PARSE_C */
612
613#if defined(POLARSSL_PK_WRITE_C)
624int pk_write_pubkey( unsigned char **p, unsigned char *start,
625 const pk_context *key );
626#endif /* POLARSSL_PK_WRITE_C */
627
628#ifdef __cplusplus
629}
630#endif
631
632#endif /* POLARSSL_PK_H */
Configuration options (set of defines)
Elliptic curve DSA.
Elliptic curves over GF(p)
Generic message digest wrapper.
md_type_t
Definition md.h:51
const char * pk_get_name(const pk_context *ctx)
Access the type name.
const pk_info_t * pk_info_from_type(pk_type_t pk_type)
Return information associated with the given PK type.
int(* pk_rsa_alt_sign_func)(void *ctx, int(*f_rng)(void *, unsigned char *, size_t), void *p_rng, int mode, md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, unsigned char *sig)
Definition pk.h:206
int pk_init_ctx_rsa_alt(pk_context *ctx, void *key, pk_rsa_alt_decrypt_func decrypt_func, pk_rsa_alt_sign_func sign_func, pk_rsa_alt_key_len_func key_len_func)
Initialize an RSA-alt context.
int pk_write_pubkey_der(pk_context *ctx, unsigned char *buf, size_t size)
Write a public key to a SubjectPublicKeyInfo DER structure Note: data is written at the end of the bu...
int pk_encrypt(pk_context *ctx, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen, size_t osize, int(*f_rng)(void *, unsigned char *, size_t), void *p_rng)
Encrypt message (including padding if relevant).
int pk_init_ctx(pk_context *ctx, const pk_info_t *info)
Initialize a PK context with the information given and allocates the type-specific PK subcontext.
int pk_parse_key(pk_context *ctx, const unsigned char *key, size_t keylen, const unsigned char *pwd, size_t pwdlen)
Parse a private key.
int pk_decrypt(pk_context *ctx, const unsigned char *input, size_t ilen, unsigned char *output, size_t *olen, size_t osize, int(*f_rng)(void *, unsigned char *, size_t), void *p_rng)
Decrypt message (including padding if relevant).
int pk_verify_ext(pk_type_t type, const void *options, pk_context *ctx, md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len)
Verify signature, with options.
int pk_parse_keyfile(pk_context *ctx, const char *path, const char *password)
Load and parse a private key.
int pk_write_pubkey_pem(pk_context *ctx, unsigned char *buf, size_t size)
Write a public key to a PEM string.
int pk_parse_public_key(pk_context *ctx, const unsigned char *key, size_t keylen)
Parse a public key.
int pk_write_key_pem(pk_context *ctx, unsigned char *buf, size_t size)
Write a private key to a PKCS#1 or SEC1 PEM string.
void pk_free(pk_context *ctx)
Free a pk_context.
int pk_sign(pk_context *ctx, md_type_t md_alg, const unsigned char *hash, size_t hash_len, unsigned char *sig, size_t *sig_len, int(*f_rng)(void *, unsigned char *, size_t), void *p_rng)
Make signature, including padding if relevant.
static size_t pk_get_len(const pk_context *ctx)
Get the length in bytes of the underlying key.
Definition pk.h:281
int pk_parse_subpubkey(unsigned char **p, const unsigned char *end, pk_context *pk)
Parse a SubjectPublicKeyInfo DER structure.
int pk_write_key_der(pk_context *ctx, unsigned char *buf, size_t size)
Write a private key to a PKCS#1 or SEC1 DER structure Note: data is written at the end of the buffer!...
int pk_verify(pk_context *ctx, md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len)
Verify signature (including padding if relevant).
pk_debug_type
Types for interfacing with the debug module.
Definition pk.h:120
@ POLARSSL_PK_DEBUG_NONE
Definition pk.h:121
@ POLARSSL_PK_DEBUG_MPI
Definition pk.h:122
@ POLARSSL_PK_DEBUG_ECP
Definition pk.h:123
int pk_parse_public_keyfile(pk_context *ctx, const char *path)
Load and parse a public key.
size_t pk_get_size(const pk_context *ctx)
Get the size in bits of the underlying key.
int pk_debug(const pk_context *ctx, pk_debug_item *items)
Export debug information.
pk_type_t pk_get_type(const pk_context *ctx)
Get the key type.
int(* pk_rsa_alt_decrypt_func)(void *ctx, int mode, size_t *olen, const unsigned char *input, unsigned char *output, size_t output_max_len)
Types for RSA-alt abstraction.
Definition pk.h:203
void pk_init(pk_context *ctx)
Initialize a pk_context (as NONE)
int pk_write_pubkey(unsigned char **p, unsigned char *start, const pk_context *key)
Write a subjectPublicKey to ASN.1 data Note: function works backwards in data buffer.
size_t(* pk_rsa_alt_key_len_func)(void *ctx)
Definition pk.h:210
pk_type_t
Public key types.
Definition pk.h:95
@ POLARSSL_PK_ECDSA
Definition pk.h:100
@ POLARSSL_PK_ECKEY
Definition pk.h:98
@ POLARSSL_PK_ECKEY_DH
Definition pk.h:99
@ POLARSSL_PK_RSASSA_PSS
Definition pk.h:102
@ POLARSSL_PK_RSA_ALT
Definition pk.h:101
@ POLARSSL_PK_RSA
Definition pk.h:97
@ POLARSSL_PK_NONE
Definition pk.h:96
int pk_can_do(pk_context *ctx, pk_type_t type)
Tell if a context can do the operation given by type.
The RSA public-key cryptosystem.
Public key container.
Definition pk.h:195
const pk_info_t * pk_info
Public key informations
Definition pk.h:196
void * pk_ctx
Underlying public key context
Definition pk.h:197
Item to send to the debug module.
Definition pk.h:130
pk_debug_type type
Definition pk.h:131
void * value
Definition pk.h:133
const char * name
Definition pk.h:132
Public key information and operations.
Definition pk.h:143
pk_type_t type
Public key type.
Definition pk.h:145
const char * name
Type name.
Definition pk.h:148
Options for RSASSA-PSS signature verification.
Definition pk.h:110
md_type_t mgf1_hash_id
Definition pk.h:111
int expected_salt_len
Definition pk.h:112