blob: a6237bf6386cb7b6208b1d9c75a8f6536b412d59 [file] [log] [blame]
Manuel Pégourié-Gonnardd73b3c12013-08-12 17:06:05 +02001/**
Chris Jonesdaacb592021-03-09 17:03:29 +00002 * \file pk_wrap.h
Manuel Pégourié-Gonnardd73b3c12013-08-12 17:06:05 +02003 *
4 * \brief Public Key abstraction layer: wrapper functions
Darryl Greena40a1012018-01-05 15:33:17 +00005 */
6/*
Bence Szépkúti1e148272020-08-07 13:07:28 +02007 * Copyright The Mbed TLS Contributors
Dave Rodgman16799db2023-11-02 19:47:20 +00008 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
Manuel Pégourié-Gonnardd73b3c12013-08-12 17:06:05 +02009 */
10
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020011#ifndef MBEDTLS_PK_WRAP_H
12#define MBEDTLS_PK_WRAP_H
Manuel Pégourié-Gonnardd73b3c12013-08-12 17:06:05 +020013
Bence Szépkútic662b362021-05-27 11:25:03 +020014#include "mbedtls/build_info.h"
Manuel Pégourié-Gonnardd73b3c12013-08-12 17:06:05 +020015
Jaeden Ameroc49fbbf2019-07-04 20:01:14 +010016#include "mbedtls/pk.h"
Manuel Pégourié-Gonnardd73b3c12013-08-12 17:06:05 +020017
Jerry Yub02ee182022-03-16 10:30:41 +080018#if defined(MBEDTLS_PSA_CRYPTO_C)
19#include "psa/crypto.h"
20#endif /* MBEDTLS_PSA_CRYPTO_C */
21
Gilles Peskine449bd832023-01-11 14:50:10 +010022struct mbedtls_pk_info_t {
Manuel Pégourié-Gonnardc89d6cf2015-03-31 14:43:19 +020023 /** Public key type */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020024 mbedtls_pk_type_t type;
Manuel Pégourié-Gonnardc89d6cf2015-03-31 14:43:19 +020025
26 /** Type name */
27 const char *name;
28
29 /** Get key size in bits */
valerio38992cb2023-04-20 09:56:30 +020030 size_t (*get_bitlen)(mbedtls_pk_context *pk);
Manuel Pégourié-Gonnardc89d6cf2015-03-31 14:43:19 +020031
32 /** Tell if the context implements this type (e.g. ECKEY can do ECDSA) */
Gilles Peskine449bd832023-01-11 14:50:10 +010033 int (*can_do)(mbedtls_pk_type_t type);
Manuel Pégourié-Gonnardc89d6cf2015-03-31 14:43:19 +020034
35 /** Verify signature */
valerio38992cb2023-04-20 09:56:30 +020036 int (*verify_func)(mbedtls_pk_context *pk, mbedtls_md_type_t md_alg,
Gilles Peskine449bd832023-01-11 14:50:10 +010037 const unsigned char *hash, size_t hash_len,
38 const unsigned char *sig, size_t sig_len);
Manuel Pégourié-Gonnardc89d6cf2015-03-31 14:43:19 +020039
40 /** Make signature */
valerio38992cb2023-04-20 09:56:30 +020041 int (*sign_func)(mbedtls_pk_context *pk, mbedtls_md_type_t md_alg,
Gilles Peskine449bd832023-01-11 14:50:10 +010042 const unsigned char *hash, size_t hash_len,
43 unsigned char *sig, size_t sig_size, size_t *sig_len,
44 int (*f_rng)(void *, unsigned char *, size_t),
45 void *p_rng);
Manuel Pégourié-Gonnardc89d6cf2015-03-31 14:43:19 +020046
Valerio Setti5b16e9e2023-02-07 08:08:53 +010047#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
Manuel Pégourié-Gonnard1f596062017-05-09 10:42:40 +020048 /** Verify signature (restartable) */
valerio38992cb2023-04-20 09:56:30 +020049 int (*verify_rs_func)(mbedtls_pk_context *pk, mbedtls_md_type_t md_alg,
Gilles Peskine449bd832023-01-11 14:50:10 +010050 const unsigned char *hash, size_t hash_len,
51 const unsigned char *sig, size_t sig_len,
52 void *rs_ctx);
Manuel Pégourié-Gonnard1f596062017-05-09 10:42:40 +020053
54 /** Make signature (restartable) */
valerio38992cb2023-04-20 09:56:30 +020055 int (*sign_rs_func)(mbedtls_pk_context *pk, mbedtls_md_type_t md_alg,
Gilles Peskine449bd832023-01-11 14:50:10 +010056 const unsigned char *hash, size_t hash_len,
57 unsigned char *sig, size_t sig_size, size_t *sig_len,
58 int (*f_rng)(void *, unsigned char *, size_t),
59 void *p_rng, void *rs_ctx);
Manuel Pégourié-Gonnardaaa98142017-08-18 17:30:37 +020060#endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */
Manuel Pégourié-Gonnard1f596062017-05-09 10:42:40 +020061
Manuel Pégourié-Gonnardc89d6cf2015-03-31 14:43:19 +020062 /** Decrypt message */
valerio38992cb2023-04-20 09:56:30 +020063 int (*decrypt_func)(mbedtls_pk_context *pk, const unsigned char *input, size_t ilen,
Gilles Peskine449bd832023-01-11 14:50:10 +010064 unsigned char *output, size_t *olen, size_t osize,
65 int (*f_rng)(void *, unsigned char *, size_t),
66 void *p_rng);
Manuel Pégourié-Gonnardc89d6cf2015-03-31 14:43:19 +020067
68 /** Encrypt message */
valerio38992cb2023-04-20 09:56:30 +020069 int (*encrypt_func)(mbedtls_pk_context *pk, const unsigned char *input, size_t ilen,
Gilles Peskine449bd832023-01-11 14:50:10 +010070 unsigned char *output, size_t *olen, size_t osize,
71 int (*f_rng)(void *, unsigned char *, size_t),
72 void *p_rng);
Manuel Pégourié-Gonnardc89d6cf2015-03-31 14:43:19 +020073
74 /** Check public-private key pair */
valerio38992cb2023-04-20 09:56:30 +020075 int (*check_pair_func)(mbedtls_pk_context *pub, mbedtls_pk_context *prv,
Gilles Peskine449bd832023-01-11 14:50:10 +010076 int (*f_rng)(void *, unsigned char *, size_t),
77 void *p_rng);
Manuel Pégourié-Gonnardc89d6cf2015-03-31 14:43:19 +020078
79 /** Allocate a new context */
Gilles Peskine449bd832023-01-11 14:50:10 +010080 void * (*ctx_alloc_func)(void);
Manuel Pégourié-Gonnardc89d6cf2015-03-31 14:43:19 +020081
82 /** Free the given context */
Gilles Peskine449bd832023-01-11 14:50:10 +010083 void (*ctx_free_func)(void *ctx);
Manuel Pégourié-Gonnardc89d6cf2015-03-31 14:43:19 +020084
Manuel Pégourié-Gonnardaaa98142017-08-18 17:30:37 +020085#if defined(MBEDTLS_ECDSA_C) && defined(MBEDTLS_ECP_RESTARTABLE)
Manuel Pégourié-Gonnard0bbc66c2017-08-18 16:22:06 +020086 /** Allocate the restart context */
Gilles Peskine449bd832023-01-11 14:50:10 +010087 void *(*rs_alloc_func)(void);
Manuel Pégourié-Gonnard0bbc66c2017-08-18 16:22:06 +020088
89 /** Free the restart context */
Gilles Peskine449bd832023-01-11 14:50:10 +010090 void (*rs_free_func)(void *rs_ctx);
Manuel Pégourié-Gonnardaaa98142017-08-18 17:30:37 +020091#endif /* MBEDTLS_ECDSA_C && MBEDTLS_ECP_RESTARTABLE */
Manuel Pégourié-Gonnard0bbc66c2017-08-18 16:22:06 +020092
Manuel Pégourié-Gonnardc89d6cf2015-03-31 14:43:19 +020093 /** Interface with the debug module */
valerio38992cb2023-04-20 09:56:30 +020094 void (*debug_func)(mbedtls_pk_context *pk, mbedtls_pk_debug_item *items);
Manuel Pégourié-Gonnardc89d6cf2015-03-31 14:43:19 +020095
96};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020097#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT)
Manuel Pégourié-Gonnard12c1ff02013-08-21 12:28:31 +020098/* Container for RSA-alt */
Gilles Peskine449bd832023-01-11 14:50:10 +010099typedef struct {
Manuel Pégourié-Gonnard12c1ff02013-08-21 12:28:31 +0200100 void *key;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200101 mbedtls_pk_rsa_alt_decrypt_func decrypt_func;
102 mbedtls_pk_rsa_alt_sign_func sign_func;
103 mbedtls_pk_rsa_alt_key_len_func key_len_func;
104} mbedtls_rsa_alt_context;
Manuel Pégourié-Gonnard348bcb32015-03-31 14:01:33 +0200105#endif
Manuel Pégourié-Gonnard12c1ff02013-08-21 12:28:31 +0200106
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200107#if defined(MBEDTLS_RSA_C)
108extern const mbedtls_pk_info_t mbedtls_rsa_info;
Manuel Pégourié-Gonnardd73b3c12013-08-12 17:06:05 +0200109#endif
110
Valerio Setti81d75122023-06-14 14:49:33 +0200111#if defined(MBEDTLS_PK_HAVE_ECC_KEYS)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200112extern const mbedtls_pk_info_t mbedtls_eckey_info;
113extern const mbedtls_pk_info_t mbedtls_eckeydh_info;
Manuel Pégourié-Gonnardd73b3c12013-08-12 17:06:05 +0200114#endif
115
Valerio Setti7ca13182023-01-27 13:22:42 +0100116#if defined(MBEDTLS_PK_CAN_ECDSA_SOME)
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200117extern const mbedtls_pk_info_t mbedtls_ecdsa_info;
Manuel Pégourié-Gonnardd73b3c12013-08-12 17:06:05 +0200118#endif
119
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200120#if defined(MBEDTLS_PK_RSA_ALT_SUPPORT)
121extern const mbedtls_pk_info_t mbedtls_rsa_alt_info;
Manuel Pégourié-Gonnard348bcb32015-03-31 14:01:33 +0200122#endif
Manuel Pégourié-Gonnard12c1ff02013-08-21 12:28:31 +0200123
Manuel Pégourié-Gonnard1ecf92c32018-10-22 12:11:15 +0200124#if defined(MBEDTLS_USE_PSA_CRYPTO)
Valerio Setti76d0f962023-06-23 13:32:54 +0200125extern const mbedtls_pk_info_t mbedtls_ecdsa_opaque_info;
126extern const mbedtls_pk_info_t mbedtls_rsa_opaque_info;
Neil Armstrong19915c22022-03-01 15:21:02 +0100127
Andrzej Kurek8a045ce2022-12-23 11:00:06 -0500128#if !defined(MBEDTLS_DEPRECATED_REMOVED)
Neil Armstrong19915c22022-03-01 15:21:02 +0100129#if defined(PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY)
Andrzej Kurek8a045ce2022-12-23 11:00:06 -0500130int MBEDTLS_DEPRECATED mbedtls_pk_error_from_psa_ecdsa(psa_status_t status);
131#endif
Neil Armstrong19915c22022-03-01 15:21:02 +0100132#endif
133
Tomi Fontanilles81746622023-07-16 13:06:06 +0300134#if defined(MBEDTLS_RSA_C)
135int mbedtls_pk_psa_rsa_sign_ext(psa_algorithm_t psa_alg_md,
136 mbedtls_rsa_context *rsa_ctx,
137 const unsigned char *hash, size_t hash_len,
138 unsigned char *sig, size_t sig_size,
139 size_t *sig_len);
140#endif /* MBEDTLS_RSA_C */
141
Jerry Yuf8aa9a42022-03-23 20:40:28 +0800142#endif /* MBEDTLS_USE_PSA_CRYPTO */
Jerry Yu75339822022-03-23 12:06:31 +0800143
144#if defined(MBEDTLS_PSA_CRYPTO_C)
Andrzej Kurek8a045ce2022-12-23 11:00:06 -0500145#if !defined(MBEDTLS_DEPRECATED_REMOVED)
146int MBEDTLS_DEPRECATED mbedtls_pk_error_from_psa(psa_status_t status);
Jerry Yu75339822022-03-23 12:06:31 +0800147
Neil Armstrong30beca32022-05-03 15:42:13 +0200148#if defined(PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY) || \
Valerio Settif6d4dfb2023-07-10 10:55:12 +0200149 defined(PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_BASIC)
Andrzej Kurek8a045ce2022-12-23 11:00:06 -0500150int MBEDTLS_DEPRECATED mbedtls_pk_error_from_psa_rsa(psa_status_t status);
Valerio Settif6d4dfb2023-07-10 10:55:12 +0200151#endif /* PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY || PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_BASIC */
Andrzej Kurek8a045ce2022-12-23 11:00:06 -0500152#endif /* !MBEDTLS_DEPRECATED_REMOVED */
Jerry Yu1d172a32022-03-12 19:12:05 +0800153
Jerry Yu406cf272022-03-22 11:33:42 +0800154#endif /* MBEDTLS_PSA_CRYPTO_C */
Neil Armstrong19915c22022-03-01 15:21:02 +0100155
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200156#endif /* MBEDTLS_PK_WRAP_H */