1 /**
2 * \file psa_util.h
3 *
4 * \brief Utility functions for the use of the PSA Crypto library.
5 */
6 /*
7 * Copyright The Mbed TLS Contributors
8 * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
9 */
10
11 #ifndef MBEDTLS_PSA_UTIL_H
12 #define MBEDTLS_PSA_UTIL_H
13 #include "mbedtls/private_access.h"
14
15 #include "mbedtls/build_info.h"
16
17 #include "psa/crypto.h"
18
19 /* 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.*/
22 #include <mbedtls/asn1write.h>
23
24 #if defined(MBEDTLS_PSA_CRYPTO_CLIENT) || defined(MCUBOOT_USE_PSA_CRYPTO)
25
26 /** The random generator function for the PSA subsystem.
27 *
28 * This function is suitable as the `f_rng` random generator function
29 * parameter of many `mbedtls_xxx` functions.
30 *
31 * The implementation of this function depends on the configuration of the
32 * library.
33 *
34 * \note This function may only be used if the PSA crypto subsystem is active.
35 * This means that you must call psa_crypto_init() before any call to
36 * this function, and you must not call this function after calling
37 * mbedtls_psa_crypto_free().
38 *
39 * \param p_rng This parameter is only kept for backward compatibility
40 * reasons with legacy `f_rng` functions and it's ignored.
41 * Set to #MBEDTLS_PSA_RANDOM_STATE or NULL.
42 * \param output The buffer to fill. It must have room for
43 * \c output_size bytes.
44 * \param output_size The number of bytes to write to \p output.
45 * This function may fail if \p output_size is too
46 * large. It is guaranteed to accept any output size
47 * requested by Mbed TLS library functions. The
48 * maximum request size depends on the library
49 * configuration.
50 *
51 * \return \c 0 on success.
52 * \return An `MBEDTLS_ERR_ENTROPY_xxx`,
53 * `MBEDTLS_ERR_PLATFORM_xxx,
54 * `MBEDTLS_ERR_CTR_DRBG_xxx` or
55 * `MBEDTLS_ERR_HMAC_DRBG_xxx` on error.
56 */
57 int mbedtls_psa_get_random(void *p_rng,
58 unsigned char *output,
59 size_t output_size);
60
61 /** The random generator state for the PSA subsystem.
62 *
63 * This macro always expands to NULL because the `p_rng` parameter is unused
64 * in mbedtls_psa_get_random(), but it's kept for interface's backward
65 * compatibility.
66 */
67 #define MBEDTLS_PSA_RANDOM_STATE NULL
68
69 /** \defgroup psa_tls_helpers TLS helper functions
70 * @{
71 */
72 #if defined(PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY)
73 #include <mbedtls/ecp.h>
74
75 /** Convert an ECC curve identifier from the Mbed TLS encoding to PSA.
76 *
77 * \param grpid An Mbed TLS elliptic curve identifier
78 * (`MBEDTLS_ECP_DP_xxx`).
79 * \param[out] bits On success the bit size of the curve; 0 on failure.
80 *
81 * \return If the curve is supported in the PSA API, this function
82 * returns the proper PSA curve identifier
83 * (`PSA_ECC_FAMILY_xxx`). This holds even if the curve is
84 * not supported by the ECP module.
85 * \return \c 0 if the curve is not supported in the PSA API.
86 */
87 psa_ecc_family_t mbedtls_ecc_group_to_psa(mbedtls_ecp_group_id grpid,
88 size_t *bits);
89
90 /** Convert an ECC curve identifier from the PSA encoding to Mbed TLS.
91 *
92 * \param family A PSA elliptic curve family identifier
93 * (`PSA_ECC_FAMILY_xxx`).
94 * \param bits The bit-length of a private key on \p curve.
95 *
96 * \return If the curve is supported in the PSA API, this function
97 * returns the corresponding Mbed TLS elliptic curve
98 * identifier (`MBEDTLS_ECP_DP_xxx`).
99 * \return #MBEDTLS_ECP_DP_NONE if the combination of \c curve
100 * and \p bits is not supported.
101 */
102 mbedtls_ecp_group_id mbedtls_ecc_group_from_psa(psa_ecc_family_t family,
103 size_t bits);
104 #endif /* PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY */
105
106 /**
107 * \brief This function returns the PSA algorithm identifier
108 * associated with the given digest type.
109 *
110 * \param md_type The type of digest to search for. Must not be NONE.
111 *
112 * \warning If \p md_type is \c MBEDTLS_MD_NONE, this function will
113 * not return \c PSA_ALG_NONE, but an invalid algorithm.
114 *
115 * \warning This function does not check if the algorithm is
116 * supported, it always returns the corresponding identifier.
117 *
118 * \return The PSA algorithm identifier associated with \p md_type,
119 * regardless of whether it is supported or not.
120 */
mbedtls_md_psa_alg_from_type(mbedtls_md_type_t md_type)121 static inline psa_algorithm_t mbedtls_md_psa_alg_from_type(mbedtls_md_type_t md_type)
122 {
123 return PSA_ALG_CATEGORY_HASH | (psa_algorithm_t) md_type;
124 }
125
126 /**
127 * \brief This function returns the given digest type
128 * associated with the PSA algorithm identifier.
129 *
130 * \param psa_alg The PSA algorithm identifier to search for.
131 *
132 * \warning This function does not check if the algorithm is
133 * supported, it always returns the corresponding identifier.
134 *
135 * \return The MD type associated with \p psa_alg,
136 * regardless of whether it is supported or not.
137 */
mbedtls_md_type_from_psa_alg(psa_algorithm_t psa_alg)138 static inline mbedtls_md_type_t mbedtls_md_type_from_psa_alg(psa_algorithm_t psa_alg)
139 {
140 return (mbedtls_md_type_t) (psa_alg & PSA_ALG_HASH_MASK);
141 }
142 #endif /* MBEDTLS_PSA_CRYPTO_CLIENT */
143
144 #if defined(MBEDTLS_PSA_UTIL_HAVE_ECDSA)
145
146 /** Convert an ECDSA signature from raw format to DER ASN.1 format.
147 *
148 * \param bits Size of each coordinate in bits.
149 * \param raw Buffer that contains the signature in raw format.
150 * \param raw_len Length of \p raw in bytes. This must be
151 * PSA_BITS_TO_BYTES(bits) bytes.
152 * \param[out] der Buffer that will be filled with the converted DER
153 * output. It can overlap with raw buffer.
154 * \param der_size Size of \p der in bytes. It is enough if \p der_size
155 * is at least the size of the actual output. (The size
156 * of the output can vary depending on the presence of
157 * leading zeros in the data.) You can use
158 * #MBEDTLS_ECDSA_MAX_SIG_LEN(\p bits) to determine a
159 * size that is large enough for all signatures for a
160 * given value of \p bits.
161 * \param[out] der_len On success it contains the amount of valid data
162 * (in bytes) written to \p der. It's undefined
163 * in case of failure.
164 */
165 int mbedtls_ecdsa_raw_to_der(size_t bits, const unsigned char *raw, size_t raw_len,
166 unsigned char *der, size_t der_size, size_t *der_len);
167
168 /** Convert an ECDSA signature from DER ASN.1 format to raw format.
169 *
170 * \param bits Size of each coordinate in bits.
171 * \param der Buffer that contains the signature in DER format.
172 * \param der_len Size of \p der in bytes.
173 * \param[out] raw Buffer that will be filled with the converted raw
174 * signature. It can overlap with der buffer.
175 * \param raw_size Size of \p raw in bytes. Must be at least
176 * 2 * PSA_BITS_TO_BYTES(bits) bytes.
177 * \param[out] raw_len On success it is updated with the amount of valid
178 * data (in bytes) written to \p raw. It's undefined
179 * in case of failure.
180 */
181 int mbedtls_ecdsa_der_to_raw(size_t bits, const unsigned char *der, size_t der_len,
182 unsigned char *raw, size_t raw_size, size_t *raw_len);
183
184 #endif /* MBEDTLS_PSA_UTIL_HAVE_ECDSA */
185
186 /**@}*/
187
188 #endif /* MBEDTLS_PSA_UTIL_H */
189