File pk.h
Public Key abstraction layer.
Defines
-
MBEDTLS_ERR_PK_ALLOC_FAILED
Memory allocation failed.
-
MBEDTLS_ERR_PK_TYPE_MISMATCH
Type mismatch, eg attempt to encrypt with an ECDSA key
-
MBEDTLS_ERR_PK_BAD_INPUT_DATA
Bad input parameters to function.
-
MBEDTLS_ERR_PK_FILE_IO_ERROR
Read/write of file failed.
-
MBEDTLS_ERR_PK_KEY_INVALID_VERSION
Unsupported key version
-
MBEDTLS_ERR_PK_KEY_INVALID_FORMAT
Invalid key tag or value.
-
MBEDTLS_ERR_PK_UNKNOWN_PK_ALG
Key algorithm is unsupported (only RSA and EC are supported).
-
MBEDTLS_ERR_PK_PASSWORD_REQUIRED
Private key password can’t be empty.
-
MBEDTLS_ERR_PK_PASSWORD_MISMATCH
Given private key password does not allow for correct decryption.
-
MBEDTLS_ERR_PK_INVALID_PUBKEY
The pubkey tag or value is invalid (only RSA and EC are supported).
-
MBEDTLS_ERR_PK_INVALID_ALG
The algorithm tag or value is invalid.
-
MBEDTLS_ERR_PK_UNKNOWN_NAMED_CURVE
Elliptic curve is unsupported (only NIST curves are supported).
-
MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE
Unavailable feature, e.g. RSA disabled for RSA key.
-
MBEDTLS_ERR_PK_SIG_LEN_MISMATCH
The buffer contains a valid signature followed by more data.
-
MBEDTLS_ERR_PK_HW_ACCEL_FAILED
PK hardware accelerator failed.
-
MBEDTLS_PK_SIGNATURE_MAX_SIZE
Maximum size of a signature made by mbedtls_pk_sign().
-
MBEDTLS_PK_SIGNATURE_MAX_SIZE
Maximum size of a signature made by mbedtls_pk_sign().
-
MBEDTLS_PK_DEBUG_MAX_ITEMS
Maximum number of item send for debugging, plus 1
Typedefs
-
typedef struct mbedtls_pk_rsassa_pss_options mbedtls_pk_rsassa_pss_options
Options for RSASSA-PSS signature verification. See
mbedtls_rsa_rsassa_pss_verify_ext()
-
typedef struct mbedtls_pk_debug_item mbedtls_pk_debug_item
Item to send to the debug module.
-
typedef struct mbedtls_pk_info_t mbedtls_pk_info_t
Public key information and operations.
-
typedef struct mbedtls_pk_context mbedtls_pk_context
Public key container.
-
typedef int (*mbedtls_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.
-
typedef int (*mbedtls_pk_rsa_alt_sign_func)(void *ctx, int (*f_rng)(void*, unsigned char*, size_t), void *p_rng, int mode, mbedtls_md_type_t md_alg, unsigned int hashlen, const unsigned char *hash, unsigned char *sig)
-
typedef size_t (*mbedtls_pk_rsa_alt_key_len_func)(void *ctx)
Enums
Functions
-
const mbedtls_pk_info_t *mbedtls_pk_info_from_type(mbedtls_pk_type_t pk_type)
Return information associated with the given PK type.
- Parameters
pk_type – PK type to search for.
- Returns
The PK info associated with the type or NULL if not found.
-
void mbedtls_pk_init(mbedtls_pk_context *ctx)
Initialize a mbedtls_pk_context (as NONE).
- Parameters
ctx – The context to initialize. This must not be
NULL.
-
void mbedtls_pk_free(mbedtls_pk_context *ctx)
Free the components of a mbedtls_pk_context.
Note
For contexts that have been set up with mbedtls_pk_setup_opaque(), this does not free the underlying PSA key and you still need to call psa_destroy_key() independently if you want to destroy that key.
- Parameters
ctx – The context to clear. It must have been initialized. If this is
NULL, this function does nothing.
-
void mbedtls_pk_restart_init(mbedtls_pk_restart_ctx *ctx)
Initialize a restart context.
- Parameters
ctx – The context to initialize. This must not be
NULL.
-
void mbedtls_pk_restart_free(mbedtls_pk_restart_ctx *ctx)
Free the components of a restart context.
- Parameters
ctx – The context to clear. It must have been initialized. If this is
NULL, this function does nothing.
-
int mbedtls_pk_setup(mbedtls_pk_context *ctx, const mbedtls_pk_info_t *info)
Initialize a PK context with the information given and allocates the type-specific PK subcontext.
Note
For contexts holding an RSA-alt key, use
mbedtls_pk_setup_rsa_alt()instead.- Parameters
ctx – Context to initialize. It must not have been set up yet (type MBEDTLS_PK_NONE).
info – Information to use
- Returns
0 on success, MBEDTLS_ERR_PK_BAD_INPUT_DATA on invalid input, MBEDTLS_ERR_PK_ALLOC_FAILED on allocation failure.
-
int mbedtls_pk_setup_opaque(mbedtls_pk_context *ctx, const psa_key_id_t key)
Initialize a PK context to wrap a PSA key.
Note
This function replaces mbedtls_pk_setup() for contexts that wrap a (possibly opaque) PSA key instead of storing and manipulating the key material directly.
Note
The wrapped key must remain valid as long as the wrapping PK context is in use, that is at least between the point this function is called and the point mbedtls_pk_free() is called on this context. The wrapped key might then be independently used or destroyed.
Note
This function is currently only available for ECC key pairs (that is, ECC keys containing private key material). Support for other key types may be added later.
- Parameters
ctx – The context to initialize. It must be empty (type NONE).
key – The PSA key to wrap, which must hold an ECC key pair (see notes below).
- Returns
0on success.- Returns
MBEDTLS_ERR_PK_BAD_INPUT_DATA on invalid input (context already used, invalid key identifier).
- Returns
MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE if the key is not an ECC key pair.
- Returns
MBEDTLS_ERR_PK_ALLOC_FAILED on allocation failure.
-
int mbedtls_pk_setup_rsa_alt(mbedtls_pk_context *ctx, void *key, mbedtls_pk_rsa_alt_decrypt_func decrypt_func, mbedtls_pk_rsa_alt_sign_func sign_func, mbedtls_pk_rsa_alt_key_len_func key_len_func)
Initialize an RSA-alt context.
Note
This function replaces
mbedtls_pk_setup()for RSA-alt.- Parameters
ctx – Context to initialize. It must not have been set up yet (type MBEDTLS_PK_NONE).
key – RSA key pointer
decrypt_func – Decryption function
sign_func – Signing function
key_len_func – Function returning key length in bytes
- Returns
0 on success, or MBEDTLS_ERR_PK_BAD_INPUT_DATA if the context wasn’t already initialized as RSA_ALT.
-
size_t mbedtls_pk_get_bitlen(const mbedtls_pk_context *ctx)
Get the size in bits of the underlying key.
- Parameters
ctx – The context to query. It must have been initialized.
- Returns
Key size in bits, or 0 on error
-
static inline size_t mbedtls_pk_get_len(const mbedtls_pk_context *ctx)
Get the length in bytes of the underlying key.
- Parameters
ctx – The context to query. It must have been initialized.
- Returns
Key length in bytes, or 0 on error
-
int mbedtls_pk_can_do(const mbedtls_pk_context *ctx, mbedtls_pk_type_t type)
Tell if a context can do the operation given by type.
- Parameters
ctx – The context to query. It must have been initialized.
type – The desired type.
- Returns
1 if the context can do operations on the given type.
- Returns
0 if the context cannot do the operations on the given type. This is always the case for a context that has been initialized but not set up, or that has been cleared with mbedtls_pk_free().
-
int mbedtls_pk_verify(mbedtls_pk_context *ctx, mbedtls_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).
Note
For RSA keys, the default padding type is PKCS#1 v1.5. Use
mbedtls_pk_verify_ext( MBEDTLS_PK_RSASSA_PSS, ... )to verify RSASSA_PSS signatures.Note
If MBEDTLS_USE_PSA_CRYPTO is enabled, the PSA crypto subsystem must have been initialized by calling psa_crypto_init() before calling this function, if the key might be an ECC (ECDSA) key.
Note
If hash_len is 0, then the length associated with md_alg is used instead, or an error returned if it is invalid.
Note
md_alg may be MBEDTLS_MD_NONE, only if hash_len != 0
- Parameters
ctx – The PK context to use. It must have been set up.
md_alg – Hash algorithm used (see notes)
hash – Hash of the message to sign
hash_len – Hash length or 0 (see notes)
sig – Signature to verify
sig_len – Signature length
- Returns
0 on success (signature is valid), MBEDTLS_ERR_PK_SIG_LEN_MISMATCH if there is a valid signature in
sigbut its length is less thansig_len, or a specific error code.
-
int mbedtls_pk_verify_restartable(mbedtls_pk_context *ctx, mbedtls_md_type_t md_alg, const unsigned char *hash, size_t hash_len, const unsigned char *sig, size_t sig_len, mbedtls_pk_restart_ctx *rs_ctx)
Restartable version of
mbedtls_pk_verify()Note
Performs the same job as
mbedtls_pk_verify(), but can return early and restart according to the limit set withmbedtls_ecp_set_max_ops()to reduce blocking for ECC operations. For RSA, same asmbedtls_pk_verify().- Parameters
ctx – The PK context to use. It must have been set up.
md_alg – Hash algorithm used (see notes)
hash – Hash of the message to sign
hash_len – Hash length or 0 (see notes)
sig – Signature to verify
sig_len – Signature length
rs_ctx – Restart context (NULL to disable restart)
- Returns
See
mbedtls_pk_verify(), or- Returns
MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of operations was reached: see
mbedtls_ecp_set_max_ops().
-
int mbedtls_pk_verify_ext(mbedtls_pk_type_t type, const void *options, mbedtls_pk_context *ctx, mbedtls_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. (Includes verification of the padding depending on type.)
Note
If hash_len is 0, then the length associated with md_alg is used instead, or an error returned if it is invalid.
Note
md_alg may be MBEDTLS_MD_NONE, only if hash_len != 0
Note
If type is MBEDTLS_PK_RSASSA_PSS, then options must point to a mbedtls_pk_rsassa_pss_options structure, otherwise it must be NULL.
- Parameters
type – Signature type (inc. possible padding type) to verify
options – Pointer to type-specific options, or NULL
ctx – The PK context to use. It must have been set up.
md_alg – Hash algorithm used (see notes)
hash – Hash of the message to sign
hash_len – Hash length or 0 (see notes)
sig – Signature to verify
sig_len – Signature length
- Returns
0 on success (signature is valid), MBEDTLS_ERR_PK_TYPE_MISMATCH if the PK context can’t be used for this type of signatures, MBEDTLS_ERR_PK_SIG_LEN_MISMATCH if there is a valid signature in
sigbut its length is less thansig_len, or a specific error code.
-
int mbedtls_pk_sign(mbedtls_pk_context *ctx, mbedtls_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.
Note
For RSA keys, the default padding type is PKCS#1 v1.5. There is no interface in the PK module to make RSASSA-PSS signatures yet.
Note
If hash_len is 0, then the length associated with md_alg is used instead, or an error returned if it is invalid.
Note
For RSA, md_alg may be MBEDTLS_MD_NONE if hash_len != 0. For ECDSA, md_alg may never be MBEDTLS_MD_NONE.
- Parameters
ctx – The PK context to use. It must have been set up with a private key.
md_alg – Hash algorithm used (see notes)
hash – Hash of the message to sign
hash_len – Hash length or 0 (see notes)
sig – Place to write the signature. It must have enough room for the signature. MBEDTLS_PK_SIGNATURE_MAX_SIZE is always enough. You may use a smaller buffer if it is large enough given the key type.
sig_len – On successful return, the number of bytes written to
sig.f_rng – RNG function
p_rng – RNG parameter
- Returns
0 on success, or a specific error code.
-
int mbedtls_pk_sign_restartable(mbedtls_pk_context *ctx, mbedtls_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, mbedtls_pk_restart_ctx *rs_ctx)
Restartable version of
mbedtls_pk_sign()Note
Performs the same job as
mbedtls_pk_sign(), but can return early and restart according to the limit set withmbedtls_ecp_set_max_ops()to reduce blocking for ECC operations. For RSA, same asmbedtls_pk_sign().- Parameters
ctx – The PK context to use. It must have been set up with a private key.
md_alg – Hash algorithm used (see notes for mbedtls_pk_sign())
hash – Hash of the message to sign
hash_len – Hash length or 0 (see notes for mbedtls_pk_sign())
sig – Place to write the signature. It must have enough room for the signature. MBEDTLS_PK_SIGNATURE_MAX_SIZE is always enough. You may use a smaller buffer if it is large enough given the key type.
sig_len – On successful return, the number of bytes written to
sig.f_rng – RNG function
p_rng – RNG parameter
rs_ctx – Restart context (NULL to disable restart)
- Returns
See
mbedtls_pk_sign().- Returns
MBEDTLS_ERR_ECP_IN_PROGRESS if maximum number of operations was reached: see
mbedtls_ecp_set_max_ops().
-
int mbedtls_pk_decrypt(mbedtls_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).
Note
For RSA keys, the default padding type is PKCS#1 v1.5.
- Parameters
ctx – The PK context to use. It must have been set up with a private key.
input – Input to decrypt
ilen – Input size
output – Decrypted output
olen – Decrypted message length
osize – Size of the output buffer
f_rng – RNG function
p_rng – RNG parameter
- Returns
0 on success, or a specific error code.
-
int mbedtls_pk_encrypt(mbedtls_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).
Note
For RSA keys, the default padding type is PKCS#1 v1.5.
- Parameters
ctx – The PK context to use. It must have been set up.
input – Message to encrypt
ilen – Message size
output – Encrypted output
olen – Encrypted output length
osize – Size of the output buffer
f_rng – RNG function
p_rng – RNG parameter
- Returns
0 on success, or a specific error code.
-
int mbedtls_pk_check_pair(const mbedtls_pk_context *pub, const mbedtls_pk_context *prv)
Check if a public-private pair of keys matches.
- Parameters
pub – Context holding a public key.
prv – Context holding a private (and public) key.
- Returns
0on success (keys were checked and match each other).- Returns
MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE if the keys could not be checked - in that case they may or may not match.
- Returns
MBEDTLS_ERR_PK_BAD_INPUT_DATA if a context is invalid.
- Returns
Another non-zero value if the keys do not match.
-
int mbedtls_pk_debug(const mbedtls_pk_context *ctx, mbedtls_pk_debug_item *items)
Export debug information.
- Parameters
ctx – The PK context to use. It must have been initialized.
items – Place to write debug items
- Returns
0 on success or MBEDTLS_ERR_PK_BAD_INPUT_DATA
-
const char *mbedtls_pk_get_name(const mbedtls_pk_context *ctx)
Access the type name.
- Parameters
ctx – The PK context to use. It must have been initialized.
- Returns
Type name on success, or “invalid PK”
-
mbedtls_pk_type_t mbedtls_pk_get_type(const mbedtls_pk_context *ctx)
Get the key type.
- Parameters
ctx – The PK context to use. It must have been initialized.
- Returns
Type on success.
- Returns
MBEDTLS_PK_NONE for a context that has not been set up.
-
static inline mbedtls_rsa_context *mbedtls_pk_rsa(const mbedtls_pk_context pk)
Quick access to an RSA context inside a PK context.
Warning
This function can only be used when the type of the context, as returned by mbedtls_pk_get_type(), is MBEDTLS_PK_RSA. Ensuring that is the caller’s responsibility. Alternatively, you can check whether this function returns NULL.
- Returns
The internal RSA context held by the PK context, or NULL.
-
static inline mbedtls_ecp_keypair *mbedtls_pk_ec(const mbedtls_pk_context pk)
Quick access to an EC context inside a PK context.
Warning
This function can only be used when the type of the context, as returned by mbedtls_pk_get_type(), is MBEDTLS_PK_ECKEY, MBEDTLS_PK_ECKEY_DH, or MBEDTLS_PK_ECDSA. Ensuring that is the caller’s responsibility. Alternatively, you can check whether this function returns NULL.
- Returns
The internal EC context held by the PK context, or NULL.
-
int mbedtls_pk_parse_key(mbedtls_pk_context *ctx, const unsigned char *key, size_t keylen, const unsigned char *pwd, size_t pwdlen)
Parse a private key in PEM or DER format.
Note
On entry, ctx must be empty, either freshly initialised with mbedtls_pk_init() or reset with mbedtls_pk_free(). If you need a specific key type, check the result with mbedtls_pk_can_do().
Note
The key is also checked for correctness.
- Parameters
ctx – The PK context to fill. It must have been initialized but not set up.
key – Input buffer to parse. The buffer must contain the input exactly, with no extra trailing material. For PEM, the buffer must contain a null-terminated string.
keylen – Size of key in bytes. For PEM data, this includes the terminating null byte, so
keylenmust be equal tostrlen(key) + 1.pwd – Optional password for decryption. Pass
NULLif expecting a non-encrypted key. Pass a string ofpwdlenbytes if expecting an encrypted key; a non-encrypted key will also be accepted. The empty password is not supported.pwdlen – Size of the password in bytes. Ignored if
pwdisNULL.
- Returns
0 if successful, or a specific PK or PEM error code
-
int mbedtls_pk_parse_public_key(mbedtls_pk_context *ctx, const unsigned char *key, size_t keylen)
Parse a public key in PEM or DER format.
Note
On entry, ctx must be empty, either freshly initialised with mbedtls_pk_init() or reset with mbedtls_pk_free(). If you need a specific key type, check the result with mbedtls_pk_can_do().
Note
The key is also checked for correctness.
- Parameters
ctx – The PK context to fill. It must have been initialized but not set up.
key – Input buffer to parse. The buffer must contain the input exactly, with no extra trailing material. For PEM, the buffer must contain a null-terminated string.
keylen – Size of key in bytes. For PEM data, this includes the terminating null byte, so
keylenmust be equal tostrlen(key) + 1.
- Returns
0 if successful, or a specific PK or PEM error code
-
int mbedtls_pk_parse_keyfile(mbedtls_pk_context *ctx, const char *path, const char *password)
Load and parse a private key.
Note
On entry, ctx must be empty, either freshly initialised with mbedtls_pk_init() or reset with mbedtls_pk_free(). If you need a specific key type, check the result with mbedtls_pk_can_do().
Note
The key is also checked for correctness.
- Parameters
ctx – The PK context to fill. It must have been initialized but not set up.
path – filename to read the private key from
password – Optional password to decrypt the file. Pass
NULLif expecting a non-encrypted key. Pass a null-terminated string if expecting an encrypted key; a non-encrypted key will also be accepted. The empty password is not supported.
- Returns
0 if successful, or a specific PK or PEM error code
-
int mbedtls_pk_parse_public_keyfile(mbedtls_pk_context *ctx, const char *path)
Load and parse a public key.
Note
On entry, ctx must be empty, either freshly initialised with mbedtls_pk_init() or reset with mbedtls_pk_free(). If you need a specific key type, check the result with mbedtls_pk_can_do().
Note
The key is also checked for correctness.
- Parameters
ctx – The PK context to fill. It must have been initialized but not set up.
path – filename to read the public key from
- Returns
0 if successful, or a specific PK or PEM error code
-
int mbedtls_pk_write_key_der(mbedtls_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! Use the return value to determine where you should start using the buffer.
- Parameters
ctx – PK context which must contain a valid private key.
buf – buffer to write to
size – size of the buffer
- Returns
length of data written if successful, or a specific error code
-
int mbedtls_pk_write_pubkey_der(mbedtls_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 buffer! Use the return value to determine where you should start using the buffer.
- Parameters
ctx – PK context which must contain a valid public or private key.
buf – buffer to write to
size – size of the buffer
- Returns
length of data written if successful, or a specific error code
-
int mbedtls_pk_write_pubkey_pem(mbedtls_pk_context *ctx, unsigned char *buf, size_t size)
Write a public key to a PEM string.
- Parameters
ctx – PK context which must contain a valid public or private key.
buf – Buffer to write to. The output includes a terminating null byte.
size – Size of the buffer in bytes.
- Returns
0 if successful, or a specific error code
-
int mbedtls_pk_write_key_pem(mbedtls_pk_context *ctx, unsigned char *buf, size_t size)
Write a private key to a PKCS#1 or SEC1 PEM string.
- Parameters
ctx – PK context which must contain a valid private key.
buf – Buffer to write to. The output includes a terminating null byte.
size – Size of the buffer in bytes.
- Returns
0 if successful, or a specific error code
-
int mbedtls_pk_parse_subpubkey(unsigned char **p, const unsigned char *end, mbedtls_pk_context *pk)
Parse a SubjectPublicKeyInfo DER structure.
- Parameters
p – the position in the ASN.1 data
end – end of the buffer
pk – The PK context to fill. It must have been initialized but not set up.
- Returns
0 if successful, or a specific PK error code
-
int mbedtls_pk_write_pubkey(unsigned char **p, unsigned char *start, const mbedtls_pk_context *key)
Write a subjectPublicKey to ASN.1 data Note: function works backwards in data buffer.
- Parameters
p – reference to current position pointer
start – start of the buffer (for bounds-checking)
key – PK context which must contain a valid public or private key.
- Returns
the length written or a negative error code
-
int mbedtls_pk_load_file(const char *path, unsigned char **buf, size_t *n)
-
int mbedtls_pk_wrap_as_opaque(mbedtls_pk_context *pk, psa_key_id_t *key, psa_algorithm_t hash_alg)
Turn an EC key into an opaque one.
Note
Only ECDSA keys are supported so far. Signing with the specified hash is the only allowed use of that key.
Warning
This is a temporary utility function for tests. It might change or be removed at any time without notice.
- Parameters
pk – Input: the EC key to import to a PSA key. Output: a PK context wrapping that PSA key.
key – Output: a PSA key identifier. It’s the caller’s responsibility to call psa_destroy_key() on that key identifier after calling mbedtls_pk_free() on the PK context.
hash_alg – The hash algorithm to allow for use with that key.
- Returns
0if successful.- Returns
An Mbed TLS error code otherwise.
-
struct mbedtls_pk_rsassa_pss_options
- #include <pk.h>
Options for RSASSA-PSS signature verification. See
mbedtls_rsa_rsassa_pss_verify_ext()
-
struct mbedtls_pk_debug_item
- #include <pk.h>
Item to send to the debug module.
-
struct mbedtls_pk_context
- #include <pk.h>
Public key container.
Public Members
-
const mbedtls_pk_info_t *pk_info
Public key information
-
void *pk_ctx
Underlying public key context
-
const mbedtls_pk_info_t *pk_info
-
struct mbedtls_pk_restart_ctx
- #include <pk.h>
Context for resuming operations.
Public Members
-
const mbedtls_pk_info_t *pk_info
Public key information
-
void *rs_ctx
Underlying restart context
-
const mbedtls_pk_info_t *pk_info