Coverage Report

Created: 2026-10-17 06:10

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/work/mbedtls-3.6.6/include/mbedtls/psa_util.h
Line
Count
Source
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)
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
0
#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
 */
121
static inline psa_algorithm_t mbedtls_md_psa_alg_from_type(mbedtls_md_type_t md_type)
122
0
{
123
0
    return PSA_ALG_CATEGORY_HASH | (psa_algorithm_t) md_type;
124
0
}
Unexecuted instantiation: x509.c:mbedtls_md_psa_alg_from_type
Unexecuted instantiation: x509_crl.c:mbedtls_md_psa_alg_from_type
Unexecuted instantiation: x509_crt.c:mbedtls_md_psa_alg_from_type
Unexecuted instantiation: x509write_csr.c:mbedtls_md_psa_alg_from_type
Unexecuted instantiation: x509_create.c:mbedtls_md_psa_alg_from_type
Unexecuted instantiation: x509write.c:mbedtls_md_psa_alg_from_type
Unexecuted instantiation: md.c:mbedtls_md_psa_alg_from_type
Unexecuted instantiation: pk.c:mbedtls_md_psa_alg_from_type
Unexecuted instantiation: pk_ecc.c:mbedtls_md_psa_alg_from_type
Unexecuted instantiation: pk_wrap.c:mbedtls_md_psa_alg_from_type
Unexecuted instantiation: pkparse.c:mbedtls_md_psa_alg_from_type
Unexecuted instantiation: pkwrite.c:mbedtls_md_psa_alg_from_type
Unexecuted instantiation: psa_crypto.c:mbedtls_md_psa_alg_from_type
Unexecuted instantiation: psa_crypto_cipher.c:mbedtls_md_psa_alg_from_type
Unexecuted instantiation: psa_crypto_ecp.c:mbedtls_md_psa_alg_from_type
Unexecuted instantiation: psa_crypto_ffdh.c:mbedtls_md_psa_alg_from_type
Unexecuted instantiation: psa_crypto_pake.c:mbedtls_md_psa_alg_from_type
Unexecuted instantiation: psa_crypto_rsa.c:mbedtls_md_psa_alg_from_type
Unexecuted instantiation: psa_crypto_random.c:mbedtls_md_psa_alg_from_type
Unexecuted instantiation: psa_util.c:mbedtls_md_psa_alg_from_type
Unexecuted instantiation: pkcs12.c:mbedtls_md_psa_alg_from_type
Unexecuted instantiation: pkcs5.c:mbedtls_md_psa_alg_from_type
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
 */
138
static inline mbedtls_md_type_t mbedtls_md_type_from_psa_alg(psa_algorithm_t psa_alg)
139
0
{
140
0
    return (mbedtls_md_type_t) (psa_alg & PSA_ALG_HASH_MASK);
141
0
}
Unexecuted instantiation: x509.c:mbedtls_md_type_from_psa_alg
Unexecuted instantiation: x509_crl.c:mbedtls_md_type_from_psa_alg
Unexecuted instantiation: x509_crt.c:mbedtls_md_type_from_psa_alg
Unexecuted instantiation: x509write_csr.c:mbedtls_md_type_from_psa_alg
Unexecuted instantiation: x509_create.c:mbedtls_md_type_from_psa_alg
Unexecuted instantiation: x509write.c:mbedtls_md_type_from_psa_alg
Unexecuted instantiation: md.c:mbedtls_md_type_from_psa_alg
Unexecuted instantiation: pk.c:mbedtls_md_type_from_psa_alg
Unexecuted instantiation: pk_ecc.c:mbedtls_md_type_from_psa_alg
Unexecuted instantiation: pk_wrap.c:mbedtls_md_type_from_psa_alg
Unexecuted instantiation: pkparse.c:mbedtls_md_type_from_psa_alg
Unexecuted instantiation: pkwrite.c:mbedtls_md_type_from_psa_alg
Unexecuted instantiation: psa_crypto.c:mbedtls_md_type_from_psa_alg
Unexecuted instantiation: psa_crypto_cipher.c:mbedtls_md_type_from_psa_alg
Unexecuted instantiation: psa_crypto_ecp.c:mbedtls_md_type_from_psa_alg
Unexecuted instantiation: psa_crypto_ffdh.c:mbedtls_md_type_from_psa_alg
Unexecuted instantiation: psa_crypto_pake.c:mbedtls_md_type_from_psa_alg
Unexecuted instantiation: psa_crypto_rsa.c:mbedtls_md_type_from_psa_alg
Unexecuted instantiation: psa_crypto_random.c:mbedtls_md_type_from_psa_alg
Unexecuted instantiation: psa_util.c:mbedtls_md_type_from_psa_alg
Unexecuted instantiation: pkcs12.c:mbedtls_md_type_from_psa_alg
Unexecuted instantiation: pkcs5.c:mbedtls_md_type_from_psa_alg
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
 * \note                    The behavior is undefined if \p der is null,
166
 *                          even if \p der_size is 0.
167
 *
168
 * \return                  0 if successful.
169
 * \return                  #MBEDTLS_ERR_ASN1_BUF_TOO_SMALL if \p der_size
170
 *                          is too small or if \p bits is larger than the
171
 *                          largest supported curve.
172
 * \return                  #MBEDTLS_ERR_ASN1_INVALID_DATA if one of the
173
 *                          numbers in the signature is 0.
174
 */
175
int mbedtls_ecdsa_raw_to_der(size_t bits, const unsigned char *raw, size_t raw_len,
176
                             unsigned char *der, size_t der_size, size_t *der_len);
177
178
/** Convert an ECDSA signature from DER ASN.1 format to raw format.
179
 *
180
 * \param       bits        Size of each coordinate in bits.
181
 * \param       der         Buffer that contains the signature in DER format.
182
 * \param       der_len     Size of \p der in bytes.
183
 * \param[out]  raw         Buffer that will be filled with the converted raw
184
 *                          signature. It can overlap with der buffer.
185
 * \param       raw_size    Size of \p raw in bytes. Must be at least
186
 *                          2 * PSA_BITS_TO_BYTES(bits) bytes.
187
 * \param[out]  raw_len     On success it is updated with the amount of valid
188
 *                          data (in bytes) written to \p raw. It's undefined
189
 *                          in case of failure.
190
 *
191
 * \return                  0 if successful.
192
 * \return                  #MBEDTLS_ERR_ASN1_BUF_TOO_SMALL if \p raw_size
193
 *                          is too small or if \p bits is larger than the
194
 *                          largest supported curve.
195
 * \return                  #MBEDTLS_ERR_ASN1_INVALID_DATA if the data in
196
 *                          \p der is inconsistent with \p bits.
197
 * \return                  An \c MBEDTLS_ERR_ASN1_xxx error code if
198
 *                          \p der is malformed.
199
 */
200
int mbedtls_ecdsa_der_to_raw(size_t bits, const unsigned char *der, size_t der_len,
201
                             unsigned char *raw, size_t raw_size, size_t *raw_len);
202
203
#endif /* MBEDTLS_PSA_UTIL_HAVE_ECDSA */
204
205
/**@}*/
206
207
#endif /* MBEDTLS_PSA_UTIL_H */