blob: 984f0315495b449b21387381a93705874d3c9a1f [file] [log] [blame]
Hanno Becker87837b22018-11-08 13:32:02 +00001/**
Hanno Beckerafebf5a2018-11-13 21:01:41 +00002 * \file psa_util.h
Hanno Becker87837b22018-11-08 13:32:02 +00003 *
4 * \brief Utility functions for the use of the PSA Crypto library.
Hanno Becker87837b22018-11-08 13:32:02 +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
Hanno Becker87837b22018-11-08 13:32:02 +00009 */
10
Hanno Becker186b65a2018-11-19 15:14:21 +000011#ifndef MBEDTLS_PSA_UTIL_H
12#define MBEDTLS_PSA_UTIL_H
Mateusz Starzyk846f0212021-05-19 19:44:07 +020013#include "mbedtls/private_access.h"
Hanno Becker87837b22018-11-08 13:32:02 +000014
Bence Szépkútic662b362021-05-27 11:25:03 +020015#include "mbedtls/build_info.h"
Hanno Becker87837b22018-11-08 13:32:02 +000016
Joakim Anderssonb3491082023-12-11 21:29:19 +010017#include "psa/crypto.h"
18
Valerio Settic22e3ce2024-01-10 08:46:59 +010019/* ASN1 defines used in the ECDSA conversion functions.
20 * Note: intentionally not adding MBEDTLS_ASN1_[PARSE|WRITE]_C guards here
21 * otherwise error codes would be unknown in test_suite_psa_crypto_util.data.*/
Valerio Setti99c03692024-01-10 08:21:10 +010022#include <mbedtls/asn1write.h>
Valerio Setti99c03692024-01-10 08:21:10 +010023
Jerry Yub02ee182022-03-16 10:30:41 +080024#if defined(MBEDTLS_PSA_CRYPTO_C)
Hanno Becker87837b22018-11-08 13:32:02 +000025
Gilles Peskinee3ed8022021-02-03 20:04:08 +010026/* Expose whatever RNG the PSA subsystem uses to applications using the
Gilles Peskine996f2162021-02-16 16:50:00 +010027 * mbedtls_xxx API. The declarations and definitions here need to be
28 * consistent with the implementation in library/psa_crypto_random_impl.h.
29 * See that file for implementation documentation. */
Jerry Yu406cf272022-03-22 11:33:42 +080030
Gilles Peskinee3ed8022021-02-03 20:04:08 +010031
32/* The type of a `f_rng` random generator function that many library functions
33 * take.
34 *
35 * This type name is not part of the Mbed TLS stable API. It may be renamed
36 * or moved without warning.
37 */
Gilles Peskine449bd832023-01-11 14:50:10 +010038typedef int mbedtls_f_rng_t(void *p_rng, unsigned char *output, size_t output_size);
Gilles Peskinee3ed8022021-02-03 20:04:08 +010039
40#if defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG)
41
42/** The random generator function for the PSA subsystem.
43 *
44 * This function is suitable as the `f_rng` random generator function
Gilles Peskine2cff7e22021-02-16 16:49:42 +010045 * parameter of many `mbedtls_xxx` functions. Use #MBEDTLS_PSA_RANDOM_STATE
46 * to obtain the \p p_rng parameter.
Gilles Peskinee3ed8022021-02-03 20:04:08 +010047 *
48 * The implementation of this function depends on the configuration of the
49 * library.
Gilles Peskine2cff7e22021-02-16 16:49:42 +010050 *
Gilles Peskinee3ed8022021-02-03 20:04:08 +010051 * \note Depending on the configuration, this may be a function or
52 * a pointer to a function.
53 *
54 * \note This function may only be used if the PSA crypto subsystem is active.
55 * This means that you must call psa_crypto_init() before any call to
56 * this function, and you must not call this function after calling
57 * mbedtls_psa_crypto_free().
58 *
59 * \param p_rng The random generator context. This must be
60 * #MBEDTLS_PSA_RANDOM_STATE. No other state is
61 * supported.
62 * \param output The buffer to fill. It must have room for
63 * \c output_size bytes.
64 * \param output_size The number of bytes to write to \p output.
65 * This function may fail if \p output_size is too
66 * large. It is guaranteed to accept any output size
67 * requested by Mbed TLS library functions. The
68 * maximum request size depends on the library
69 * configuration.
70 *
71 * \return \c 0 on success.
72 * \return An `MBEDTLS_ERR_ENTROPY_xxx`,
Gilles Peskine2cff7e22021-02-16 16:49:42 +010073 * `MBEDTLS_ERR_PLATFORM_xxx,
Gilles Peskinee3ed8022021-02-03 20:04:08 +010074 * `MBEDTLS_ERR_CTR_DRBG_xxx` or
75 * `MBEDTLS_ERR_HMAC_DRBG_xxx` on error.
76 */
Gilles Peskine449bd832023-01-11 14:50:10 +010077int mbedtls_psa_get_random(void *p_rng,
78 unsigned char *output,
79 size_t output_size);
Gilles Peskinee3ed8022021-02-03 20:04:08 +010080
81/** The random generator state for the PSA subsystem.
82 *
83 * This macro expands to an expression which is suitable as the `p_rng`
84 * random generator state parameter of many `mbedtls_xxx` functions.
85 * It must be used in combination with the random generator function
86 * mbedtls_psa_get_random().
87 *
88 * The implementation of this macro depends on the configuration of the
89 * library. Do not make any assumption on its nature.
90 */
91#define MBEDTLS_PSA_RANDOM_STATE NULL
92
93#else /* !defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG) */
94
95#if defined(MBEDTLS_CTR_DRBG_C)
96#include "mbedtls/ctr_drbg.h"
97typedef mbedtls_ctr_drbg_context mbedtls_psa_drbg_context_t;
98static mbedtls_f_rng_t *const mbedtls_psa_get_random = mbedtls_ctr_drbg_random;
99#elif defined(MBEDTLS_HMAC_DRBG_C)
100#include "mbedtls/hmac_drbg.h"
101typedef mbedtls_hmac_drbg_context mbedtls_psa_drbg_context_t;
102static mbedtls_f_rng_t *const mbedtls_psa_get_random = mbedtls_hmac_drbg_random;
103#endif
104extern mbedtls_psa_drbg_context_t *const mbedtls_psa_random_state;
105
106#define MBEDTLS_PSA_RANDOM_STATE mbedtls_psa_random_state
107
108#endif /* !defined(MBEDTLS_PSA_CRYPTO_EXTERNAL_RNG) */
109
Joakim Anderssonb3491082023-12-11 21:29:19 +0100110/** \defgroup psa_tls_helpers TLS helper functions
111 * @{
112 */
113#if defined(PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY)
114#include <mbedtls/ecp.h>
115
116/** Convert an ECC curve identifier from the Mbed TLS encoding to PSA.
117 *
Joakim Anderssonb3491082023-12-11 21:29:19 +0100118 * \param grpid An Mbed TLS elliptic curve identifier
119 * (`MBEDTLS_ECP_DP_xxx`).
Valerio Settieca07142024-01-04 13:17:31 +0100120 * \param[out] bits On success the bit size of the curve; 0 on failure.
Joakim Anderssonb3491082023-12-11 21:29:19 +0100121 *
Valerio Settid0aa9c12024-01-09 09:10:44 +0100122 * \return If the curve is supported in the PSA API, this function
123 * returns the proper PSA curve identifier
124 * (`PSA_ECC_FAMILY_xxx`). This holds even if the curve is
125 * not supported by the ECP module.
126 * \return \c 0 if the curve is not supported in the PSA API.
Joakim Anderssonb3491082023-12-11 21:29:19 +0100127 */
128psa_ecc_family_t mbedtls_ecc_group_to_psa(mbedtls_ecp_group_id grpid,
129 size_t *bits);
130
131/** Convert an ECC curve identifier from the PSA encoding to Mbed TLS.
132 *
Valerio Setti39faa9c2024-01-09 09:11:22 +0100133 * \param family A PSA elliptic curve family identifier
Joakim Anderssonb3491082023-12-11 21:29:19 +0100134 * (`PSA_ECC_FAMILY_xxx`).
135 * \param bits The bit-length of a private key on \p curve.
Joakim Anderssonb3491082023-12-11 21:29:19 +0100136 *
Valerio Settid0aa9c12024-01-09 09:10:44 +0100137 * \return If the curve is supported in the PSA API, this function
138 * returns the corresponding Mbed TLS elliptic curve
Valerio Settieca07142024-01-04 13:17:31 +0100139 * identifier (`MBEDTLS_ECP_DP_xxx`).
Valerio Setti0e608802023-12-29 11:46:44 +0100140 * \return #MBEDTLS_ECP_DP_NONE if the combination of \c curve
Valerio Settid0aa9c12024-01-09 09:10:44 +0100141 * and \p bits is not supported.
Joakim Anderssonb3491082023-12-11 21:29:19 +0100142 */
Valerio Setti39faa9c2024-01-09 09:11:22 +0100143mbedtls_ecp_group_id mbedtls_ecc_group_from_psa(psa_ecc_family_t family,
Valerio Settid36c3132023-12-21 14:03:51 +0100144 size_t bits);
Joakim Anderssonb3491082023-12-11 21:29:19 +0100145#endif /* PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY */
146
Valerio Setti45c3cae2024-01-02 13:26:04 +0100147/**
148 * \brief This function returns the PSA algorithm identifier
149 * associated with the given digest type.
150 *
Valerio Settidd2afcd2024-01-09 08:41:29 +0100151 * \param md_type The type of digest to search for. Must not be NONE.
Valerio Setti45c3cae2024-01-02 13:26:04 +0100152 *
Valerio Settidd2afcd2024-01-09 08:41:29 +0100153 * \warning If \p md_type is \c MBEDTLS_MD_NONE, this function will
154 * not return \c PSA_ALG_NONE, but an invalid algorithm.
155 *
156 * \warning This function does not check if the algorithm is
157 * supported, it always returns the corresponding identifier.
158 *
159 * \return The PSA algorithm identifier associated with \p md_type,
160 * regardless of whether it is supported or not.
Valerio Setti45c3cae2024-01-02 13:26:04 +0100161 */
Valerio Settidd2afcd2024-01-09 08:41:29 +0100162static inline psa_algorithm_t mbedtls_md_psa_alg_from_type(mbedtls_md_type_t md_type)
163{
164 return PSA_ALG_CATEGORY_HASH | (psa_algorithm_t) md_type;
165}
Valerio Setti45c3cae2024-01-02 13:26:04 +0100166
167/**
168 * \brief This function returns the given digest type
169 * associated with the PSA algorithm identifier.
170 *
171 * \param psa_alg The PSA algorithm identifier to search for.
172 *
Valerio Settidd2afcd2024-01-09 08:41:29 +0100173 * \warning This function does not check if the algorithm is
174 * supported, it always returns the corresponding identifier.
175 *
Valerio Setti45c3cae2024-01-02 13:26:04 +0100176 * \return The MD type associated with \p psa_alg,
Valerio Settidd2afcd2024-01-09 08:41:29 +0100177 * regardless of whether it is supported or not.
Valerio Setti45c3cae2024-01-02 13:26:04 +0100178 */
Valerio Settidd2afcd2024-01-09 08:41:29 +0100179static inline mbedtls_md_type_t mbedtls_md_type_from_psa_alg(psa_algorithm_t psa_alg)
180{
181 return (mbedtls_md_type_t) (psa_alg & PSA_ALG_HASH_MASK);
182}
Valerio Settic22e3ce2024-01-10 08:46:59 +0100183#endif /* MBEDTLS_PSA_CRYPTO_C */
Valerio Setti45c3cae2024-01-02 13:26:04 +0100184
Valerio Settif4d2dc22024-01-16 10:57:48 +0100185#if defined(MBEDTLS_PSA_UTIL_HAVE_ECDSA)
186
Valerio Setti86451972024-02-05 09:50:20 +0100187/** Convert an ECDSA signature from raw format to DER ASN.1 format.
Valerio Setti75501f52024-01-08 16:49:17 +0100188 *
Valerio Setti315e4af2024-02-05 10:09:15 +0100189 * \param bits Size of each coordinate in bits.
Valerio Setti75501f52024-01-08 16:49:17 +0100190 * \param raw Buffer that contains the signature in raw format.
Valerio Setti6269f3b2024-02-06 16:55:18 +0100191 * \param raw_len Length of \p raw in bytes. This must be
Valerio Setti8334d002024-02-05 15:35:26 +0100192 * PSA_BITS_TO_BYTES(bits) bytes.
Valerio Setti75501f52024-01-08 16:49:17 +0100193 * \param[out] der Buffer that will be filled with the converted DER
194 * output. It can overlap with raw buffer.
Valerio Settiaffba302024-02-07 15:03:33 +0100195 * \param der_size Size of \p der in bytes. It is enough if \p der_size
196 * is at least the size of the actual output. (The size
197 * of the output can vary depending on the presence of
198 * leading zeros in the data.) You can use
199 * #MBEDTLS_ECDSA_MAX_SIG_LEN(\p bits) to determine a
200 * size that is large enough for all signatures for a
201 * given value of \p bits.
Valerio Setti75501f52024-01-08 16:49:17 +0100202 * \param[out] der_len On success it contains the amount of valid data
Valerio Setti86451972024-02-05 09:50:20 +0100203 * (in bytes) written to \p der. It's undefined
Valerio Setti75501f52024-01-08 16:49:17 +0100204 * in case of failure.
Valerio Setti75501f52024-01-08 16:49:17 +0100205 */
Valerio Setti315e4af2024-02-05 10:09:15 +0100206int mbedtls_ecdsa_raw_to_der(size_t bits, const unsigned char *raw, size_t raw_len,
207 unsigned char *der, size_t der_size, size_t *der_len);
Valerio Setti75501f52024-01-08 16:49:17 +0100208
Valerio Setti86451972024-02-05 09:50:20 +0100209/** Convert an ECDSA signature from DER ASN.1 format to raw format.
Valerio Setti75501f52024-01-08 16:49:17 +0100210 *
Valerio Setti315e4af2024-02-05 10:09:15 +0100211 * \param bits Size of each coordinate in bits.
Valerio Setti75501f52024-01-08 16:49:17 +0100212 * \param der Buffer that contains the signature in DER format.
Valerio Setti86451972024-02-05 09:50:20 +0100213 * \param der_len Size of \p der in bytes.
Valerio Setti75501f52024-01-08 16:49:17 +0100214 * \param[out] raw Buffer that will be filled with the converted raw
215 * signature. It can overlap with der buffer.
Valerio Settie01a2b02024-02-05 15:16:36 +0100216 * \param raw_size Size of \p raw in bytes. Must be at least
217 * 2 * PSA_BITS_TO_BYTES(bits) bytes.
Valerio Setti75501f52024-01-08 16:49:17 +0100218 * \param[out] raw_len On success it is updated with the amount of valid
Valerio Setti86451972024-02-05 09:50:20 +0100219 * data (in bytes) written to \p raw. It's undefined
Valerio Setti75501f52024-01-08 16:49:17 +0100220 * in case of failure.
Valerio Setti75501f52024-01-08 16:49:17 +0100221 */
Valerio Setti315e4af2024-02-05 10:09:15 +0100222int mbedtls_ecdsa_der_to_raw(size_t bits, const unsigned char *der, size_t der_len,
223 unsigned char *raw, size_t raw_size, size_t *raw_len);
Valerio Setti75501f52024-01-08 16:49:17 +0100224
Valerio Settif4d2dc22024-01-16 10:57:48 +0100225#endif /* MBEDTLS_PSA_UTIL_HAVE_ECDSA */
226
Joakim Anderssonb3491082023-12-11 21:29:19 +0100227/**@}*/
228
Hanno Becker186b65a2018-11-19 15:14:21 +0000229#endif /* MBEDTLS_PSA_UTIL_H */