1*62c56f98SSadaf Ebrahimi /*
2*62c56f98SSadaf Ebrahimi * PSA hashing layer on top of Mbed TLS software crypto
3*62c56f98SSadaf Ebrahimi */
4*62c56f98SSadaf Ebrahimi /*
5*62c56f98SSadaf Ebrahimi * Copyright The Mbed TLS Contributors
6*62c56f98SSadaf Ebrahimi * SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
7*62c56f98SSadaf Ebrahimi */
8*62c56f98SSadaf Ebrahimi
9*62c56f98SSadaf Ebrahimi #include "common.h"
10*62c56f98SSadaf Ebrahimi
11*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PSA_CRYPTO_C)
12*62c56f98SSadaf Ebrahimi
13*62c56f98SSadaf Ebrahimi #include <psa/crypto.h>
14*62c56f98SSadaf Ebrahimi
15*62c56f98SSadaf Ebrahimi #include "psa_crypto_core.h"
16*62c56f98SSadaf Ebrahimi #include "psa_util_internal.h"
17*62c56f98SSadaf Ebrahimi
18*62c56f98SSadaf Ebrahimi /* The following includes are needed for MBEDTLS_ERR_XXX macros */
19*62c56f98SSadaf Ebrahimi #include <mbedtls/error.h>
20*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_LIGHT)
21*62c56f98SSadaf Ebrahimi #include <mbedtls/md.h>
22*62c56f98SSadaf Ebrahimi #endif
23*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_LMS_C)
24*62c56f98SSadaf Ebrahimi #include <mbedtls/lms.h>
25*62c56f98SSadaf Ebrahimi #endif
26*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_TLS_C) && \
27*62c56f98SSadaf Ebrahimi (defined(MBEDTLS_USE_PSA_CRYPTO) || defined(MBEDTLS_SSL_PROTO_TLS1_3))
28*62c56f98SSadaf Ebrahimi #include <mbedtls/ssl.h>
29*62c56f98SSadaf Ebrahimi #endif
30*62c56f98SSadaf Ebrahimi #if defined(PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY) || \
31*62c56f98SSadaf Ebrahimi defined(PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_BASIC)
32*62c56f98SSadaf Ebrahimi #include <mbedtls/rsa.h>
33*62c56f98SSadaf Ebrahimi #endif
34*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO) && \
35*62c56f98SSadaf Ebrahimi defined(PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY)
36*62c56f98SSadaf Ebrahimi #include <mbedtls/ecp.h>
37*62c56f98SSadaf Ebrahimi #endif
38*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PK_C)
39*62c56f98SSadaf Ebrahimi #include <mbedtls/pk.h>
40*62c56f98SSadaf Ebrahimi #endif
41*62c56f98SSadaf Ebrahimi
42*62c56f98SSadaf Ebrahimi /* PSA_SUCCESS is kept at the top of each error table since
43*62c56f98SSadaf Ebrahimi * it's the most common status when everything functions properly. */
44*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_MD_LIGHT)
45*62c56f98SSadaf Ebrahimi const mbedtls_error_pair_t psa_to_md_errors[] =
46*62c56f98SSadaf Ebrahimi {
47*62c56f98SSadaf Ebrahimi { PSA_SUCCESS, 0 },
48*62c56f98SSadaf Ebrahimi { PSA_ERROR_NOT_SUPPORTED, MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE },
49*62c56f98SSadaf Ebrahimi { PSA_ERROR_INVALID_ARGUMENT, MBEDTLS_ERR_MD_BAD_INPUT_DATA },
50*62c56f98SSadaf Ebrahimi { PSA_ERROR_INSUFFICIENT_MEMORY, MBEDTLS_ERR_MD_ALLOC_FAILED }
51*62c56f98SSadaf Ebrahimi };
52*62c56f98SSadaf Ebrahimi #endif
53*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_LMS_C)
54*62c56f98SSadaf Ebrahimi const mbedtls_error_pair_t psa_to_lms_errors[] =
55*62c56f98SSadaf Ebrahimi {
56*62c56f98SSadaf Ebrahimi { PSA_SUCCESS, 0 },
57*62c56f98SSadaf Ebrahimi { PSA_ERROR_BUFFER_TOO_SMALL, MBEDTLS_ERR_LMS_BUFFER_TOO_SMALL },
58*62c56f98SSadaf Ebrahimi { PSA_ERROR_INVALID_ARGUMENT, MBEDTLS_ERR_LMS_BAD_INPUT_DATA }
59*62c56f98SSadaf Ebrahimi };
60*62c56f98SSadaf Ebrahimi #endif
61*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_SSL_TLS_C) && \
62*62c56f98SSadaf Ebrahimi (defined(MBEDTLS_USE_PSA_CRYPTO) || defined(MBEDTLS_SSL_PROTO_TLS1_3))
63*62c56f98SSadaf Ebrahimi const mbedtls_error_pair_t psa_to_ssl_errors[] =
64*62c56f98SSadaf Ebrahimi {
65*62c56f98SSadaf Ebrahimi { PSA_SUCCESS, 0 },
66*62c56f98SSadaf Ebrahimi { PSA_ERROR_INSUFFICIENT_MEMORY, MBEDTLS_ERR_SSL_ALLOC_FAILED },
67*62c56f98SSadaf Ebrahimi { PSA_ERROR_NOT_SUPPORTED, MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE },
68*62c56f98SSadaf Ebrahimi { PSA_ERROR_INVALID_SIGNATURE, MBEDTLS_ERR_SSL_INVALID_MAC },
69*62c56f98SSadaf Ebrahimi { PSA_ERROR_INVALID_ARGUMENT, MBEDTLS_ERR_SSL_BAD_INPUT_DATA },
70*62c56f98SSadaf Ebrahimi { PSA_ERROR_BAD_STATE, MBEDTLS_ERR_SSL_INTERNAL_ERROR },
71*62c56f98SSadaf Ebrahimi { PSA_ERROR_BUFFER_TOO_SMALL, MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL }
72*62c56f98SSadaf Ebrahimi };
73*62c56f98SSadaf Ebrahimi #endif
74*62c56f98SSadaf Ebrahimi
75*62c56f98SSadaf Ebrahimi #if defined(PSA_WANT_KEY_TYPE_RSA_PUBLIC_KEY) || \
76*62c56f98SSadaf Ebrahimi defined(PSA_WANT_KEY_TYPE_RSA_KEY_PAIR_BASIC)
77*62c56f98SSadaf Ebrahimi const mbedtls_error_pair_t psa_to_pk_rsa_errors[] =
78*62c56f98SSadaf Ebrahimi {
79*62c56f98SSadaf Ebrahimi { PSA_SUCCESS, 0 },
80*62c56f98SSadaf Ebrahimi { PSA_ERROR_NOT_PERMITTED, MBEDTLS_ERR_RSA_BAD_INPUT_DATA },
81*62c56f98SSadaf Ebrahimi { PSA_ERROR_INVALID_ARGUMENT, MBEDTLS_ERR_RSA_BAD_INPUT_DATA },
82*62c56f98SSadaf Ebrahimi { PSA_ERROR_INVALID_HANDLE, MBEDTLS_ERR_RSA_BAD_INPUT_DATA },
83*62c56f98SSadaf Ebrahimi { PSA_ERROR_BUFFER_TOO_SMALL, MBEDTLS_ERR_RSA_OUTPUT_TOO_LARGE },
84*62c56f98SSadaf Ebrahimi { PSA_ERROR_INSUFFICIENT_ENTROPY, MBEDTLS_ERR_RSA_RNG_FAILED },
85*62c56f98SSadaf Ebrahimi { PSA_ERROR_INVALID_SIGNATURE, MBEDTLS_ERR_RSA_VERIFY_FAILED },
86*62c56f98SSadaf Ebrahimi { PSA_ERROR_INVALID_PADDING, MBEDTLS_ERR_RSA_INVALID_PADDING }
87*62c56f98SSadaf Ebrahimi };
88*62c56f98SSadaf Ebrahimi #endif
89*62c56f98SSadaf Ebrahimi
90*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_USE_PSA_CRYPTO) && \
91*62c56f98SSadaf Ebrahimi defined(PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY)
92*62c56f98SSadaf Ebrahimi const mbedtls_error_pair_t psa_to_pk_ecdsa_errors[] =
93*62c56f98SSadaf Ebrahimi {
94*62c56f98SSadaf Ebrahimi { PSA_SUCCESS, 0 },
95*62c56f98SSadaf Ebrahimi { PSA_ERROR_NOT_PERMITTED, MBEDTLS_ERR_ECP_BAD_INPUT_DATA },
96*62c56f98SSadaf Ebrahimi { PSA_ERROR_INVALID_ARGUMENT, MBEDTLS_ERR_ECP_BAD_INPUT_DATA },
97*62c56f98SSadaf Ebrahimi { PSA_ERROR_INVALID_HANDLE, MBEDTLS_ERR_ECP_FEATURE_UNAVAILABLE },
98*62c56f98SSadaf Ebrahimi { PSA_ERROR_BUFFER_TOO_SMALL, MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL },
99*62c56f98SSadaf Ebrahimi { PSA_ERROR_INSUFFICIENT_ENTROPY, MBEDTLS_ERR_ECP_RANDOM_FAILED },
100*62c56f98SSadaf Ebrahimi { PSA_ERROR_INVALID_SIGNATURE, MBEDTLS_ERR_ECP_VERIFY_FAILED }
101*62c56f98SSadaf Ebrahimi };
102*62c56f98SSadaf Ebrahimi #endif
103*62c56f98SSadaf Ebrahimi
psa_generic_status_to_mbedtls(psa_status_t status)104*62c56f98SSadaf Ebrahimi int psa_generic_status_to_mbedtls(psa_status_t status)
105*62c56f98SSadaf Ebrahimi {
106*62c56f98SSadaf Ebrahimi switch (status) {
107*62c56f98SSadaf Ebrahimi case PSA_SUCCESS:
108*62c56f98SSadaf Ebrahimi return 0;
109*62c56f98SSadaf Ebrahimi case PSA_ERROR_NOT_SUPPORTED:
110*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_PLATFORM_FEATURE_UNSUPPORTED;
111*62c56f98SSadaf Ebrahimi case PSA_ERROR_CORRUPTION_DETECTED:
112*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
113*62c56f98SSadaf Ebrahimi case PSA_ERROR_COMMUNICATION_FAILURE:
114*62c56f98SSadaf Ebrahimi case PSA_ERROR_HARDWARE_FAILURE:
115*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_PLATFORM_HW_ACCEL_FAILED;
116*62c56f98SSadaf Ebrahimi case PSA_ERROR_NOT_PERMITTED:
117*62c56f98SSadaf Ebrahimi default:
118*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_ERROR_GENERIC_ERROR;
119*62c56f98SSadaf Ebrahimi }
120*62c56f98SSadaf Ebrahimi }
121*62c56f98SSadaf Ebrahimi
psa_status_to_mbedtls(psa_status_t status,const mbedtls_error_pair_t * local_translations,size_t local_errors_num,int (* fallback_f)(psa_status_t))122*62c56f98SSadaf Ebrahimi int psa_status_to_mbedtls(psa_status_t status,
123*62c56f98SSadaf Ebrahimi const mbedtls_error_pair_t *local_translations,
124*62c56f98SSadaf Ebrahimi size_t local_errors_num,
125*62c56f98SSadaf Ebrahimi int (*fallback_f)(psa_status_t))
126*62c56f98SSadaf Ebrahimi {
127*62c56f98SSadaf Ebrahimi for (size_t i = 0; i < local_errors_num; i++) {
128*62c56f98SSadaf Ebrahimi if (status == local_translations[i].psa_status) {
129*62c56f98SSadaf Ebrahimi return local_translations[i].mbedtls_error;
130*62c56f98SSadaf Ebrahimi }
131*62c56f98SSadaf Ebrahimi }
132*62c56f98SSadaf Ebrahimi return fallback_f(status);
133*62c56f98SSadaf Ebrahimi }
134*62c56f98SSadaf Ebrahimi
135*62c56f98SSadaf Ebrahimi #if defined(MBEDTLS_PK_C)
psa_pk_status_to_mbedtls(psa_status_t status)136*62c56f98SSadaf Ebrahimi int psa_pk_status_to_mbedtls(psa_status_t status)
137*62c56f98SSadaf Ebrahimi {
138*62c56f98SSadaf Ebrahimi switch (status) {
139*62c56f98SSadaf Ebrahimi case PSA_ERROR_INVALID_HANDLE:
140*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_PK_KEY_INVALID_FORMAT;
141*62c56f98SSadaf Ebrahimi case PSA_ERROR_BUFFER_TOO_SMALL:
142*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_PK_BUFFER_TOO_SMALL;
143*62c56f98SSadaf Ebrahimi case PSA_ERROR_NOT_SUPPORTED:
144*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_PK_FEATURE_UNAVAILABLE;
145*62c56f98SSadaf Ebrahimi case PSA_ERROR_INVALID_ARGUMENT:
146*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_PK_INVALID_ALG;
147*62c56f98SSadaf Ebrahimi case PSA_ERROR_INSUFFICIENT_MEMORY:
148*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_PK_ALLOC_FAILED;
149*62c56f98SSadaf Ebrahimi case PSA_ERROR_BAD_STATE:
150*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_PK_BAD_INPUT_DATA;
151*62c56f98SSadaf Ebrahimi case PSA_ERROR_DATA_CORRUPT:
152*62c56f98SSadaf Ebrahimi case PSA_ERROR_DATA_INVALID:
153*62c56f98SSadaf Ebrahimi case PSA_ERROR_STORAGE_FAILURE:
154*62c56f98SSadaf Ebrahimi return MBEDTLS_ERR_PK_FILE_IO_ERROR;
155*62c56f98SSadaf Ebrahimi default:
156*62c56f98SSadaf Ebrahimi return psa_generic_status_to_mbedtls(status);
157*62c56f98SSadaf Ebrahimi }
158*62c56f98SSadaf Ebrahimi }
159*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PK_C */
160*62c56f98SSadaf Ebrahimi #endif /* MBEDTLS_PSA_CRYPTO_C */
161