18849c126SEtienne Carriere // SPDX-License-Identifier: BSD-2-Clause
28849c126SEtienne Carriere /*
38849c126SEtienne Carriere * Copyright (c) 2017-2020, Linaro Limited
48849c126SEtienne Carriere */
58849c126SEtienne Carriere
68849c126SEtienne Carriere #include <assert.h>
78849c126SEtienne Carriere #include <pkcs11_ta.h>
88849c126SEtienne Carriere #include <string.h>
98849c126SEtienne Carriere #include <util.h>
108849c126SEtienne Carriere #include <tee_api.h>
118849c126SEtienne Carriere #include <tee_internal_api_extensions.h>
128849c126SEtienne Carriere
138849c126SEtienne Carriere #include "pkcs11_helpers.h"
148849c126SEtienne Carriere #include "token_capabilities.h"
158849c126SEtienne Carriere
168849c126SEtienne Carriere #define ALLOWED_PKCS11_CKFM \
178849c126SEtienne Carriere (PKCS11_CKFM_ENCRYPT | PKCS11_CKFM_DECRYPT | \
188849c126SEtienne Carriere PKCS11_CKFM_DERIVE | PKCS11_CKFM_DIGEST | \
198849c126SEtienne Carriere PKCS11_CKFM_SIGN | PKCS11_CKFM_SIGN_RECOVER | \
208849c126SEtienne Carriere PKCS11_CKFM_VERIFY | PKCS11_CKFM_VERIFY_RECOVER | \
218849c126SEtienne Carriere PKCS11_CKFM_GENERATE | PKCS11_CKFM_GENERATE_KEY_PAIR | \
228849c126SEtienne Carriere PKCS11_CKFM_WRAP | PKCS11_CKFM_UNWRAP)
238849c126SEtienne Carriere
248849c126SEtienne Carriere /*
258849c126SEtienne Carriere * Definition of supported processings for a PKCS#11 mechanisms
268849c126SEtienne Carriere * @id: Mechanism ID
278849c126SEtienne Carriere * @flags: Valid PKCS11_CKFM_* for a mechanism as per PKCS#11
288849c126SEtienne Carriere * @one_shot: true of mechanism can be used for a one-short processing
298849c126SEtienne Carriere * @string: Helper string of the mechanism ID for debug purpose
308849c126SEtienne Carriere */
318849c126SEtienne Carriere struct pkcs11_mechachism_modes {
328849c126SEtienne Carriere uint32_t id;
338849c126SEtienne Carriere uint32_t flags;
348849c126SEtienne Carriere bool one_shot;
358849c126SEtienne Carriere #if CFG_TEE_TA_LOG_LEVEL > 0
368849c126SEtienne Carriere const char *string;
378849c126SEtienne Carriere #endif
388849c126SEtienne Carriere };
398849c126SEtienne Carriere
408849c126SEtienne Carriere #if CFG_TEE_TA_LOG_LEVEL > 0
418849c126SEtienne Carriere #define MECHANISM(_label, _flags, _single_part) \
428849c126SEtienne Carriere { \
438849c126SEtienne Carriere .id = _label, \
448849c126SEtienne Carriere .one_shot = (_single_part), \
458849c126SEtienne Carriere .flags = (_flags), \
468849c126SEtienne Carriere .string = #_label, \
478849c126SEtienne Carriere }
488849c126SEtienne Carriere #else
498849c126SEtienne Carriere #define MECHANISM(_label, _flags, _single_part) \
508849c126SEtienne Carriere { \
518849c126SEtienne Carriere .id = _label, \
528849c126SEtienne Carriere .one_shot = (_single_part), \
538849c126SEtienne Carriere .flags = (_flags), \
548849c126SEtienne Carriere }
558849c126SEtienne Carriere #endif
568849c126SEtienne Carriere
578849c126SEtienne Carriere #define SINGLE_PART_ONLY true
588849c126SEtienne Carriere #define ANY_PART false
598849c126SEtienne Carriere
60512cbf1dSJens Wiklander #define CKFM_CIPHER (PKCS11_CKFM_ENCRYPT | PKCS11_CKFM_DECRYPT)
61512cbf1dSJens Wiklander #define CKFM_WRAP_UNWRAP (PKCS11_CKFM_WRAP | PKCS11_CKFM_UNWRAP)
62512cbf1dSJens Wiklander #define CKFM_CIPHER_WRAP (CKFM_CIPHER | CKFM_WRAP_UNWRAP)
63512cbf1dSJens Wiklander #define CKFM_CIPHER_WRAP_DERIVE (CKFM_CIPHER_WRAP | PKCS11_CKFM_DERIVE)
64512cbf1dSJens Wiklander #define CKFM_AUTH_NO_RECOVER (PKCS11_CKFM_SIGN | PKCS11_CKFM_VERIFY)
65512cbf1dSJens Wiklander #define CKFM_AUTH_WITH_RECOVER (PKCS11_CKFM_SIGN_RECOVER | \
66512cbf1dSJens Wiklander PKCS11_CKFM_VERIFY_RECOVER)
67512cbf1dSJens Wiklander
688849c126SEtienne Carriere /* PKCS#11 specificies permitted operation for each mechanism */
698849c126SEtienne Carriere static const struct pkcs11_mechachism_modes pkcs11_modes[] = {
70512cbf1dSJens Wiklander /* AES */
71512cbf1dSJens Wiklander MECHANISM(PKCS11_CKM_AES_ECB, CKFM_CIPHER_WRAP, ANY_PART),
72512cbf1dSJens Wiklander MECHANISM(PKCS11_CKM_AES_CBC, CKFM_CIPHER_WRAP, ANY_PART),
73512cbf1dSJens Wiklander MECHANISM(PKCS11_CKM_AES_CBC_PAD, CKFM_CIPHER_WRAP, ANY_PART),
74512cbf1dSJens Wiklander MECHANISM(PKCS11_CKM_AES_CTS, CKFM_CIPHER_WRAP, ANY_PART),
75512cbf1dSJens Wiklander MECHANISM(PKCS11_CKM_AES_CTR, CKFM_CIPHER_WRAP, ANY_PART),
7663778faaSEtienne Carriere MECHANISM(PKCS11_CKM_AES_GCM, CKFM_CIPHER_WRAP, ANY_PART),
770ef6b144SVictor Chong MECHANISM(PKCS11_CKM_AES_CMAC, CKFM_AUTH_NO_RECOVER, ANY_PART),
780ef6b144SVictor Chong MECHANISM(PKCS11_CKM_AES_CMAC_GENERAL, CKFM_AUTH_NO_RECOVER, ANY_PART),
79512cbf1dSJens Wiklander MECHANISM(PKCS11_CKM_AES_ECB_ENCRYPT_DATA, PKCS11_CKFM_DERIVE,
808849c126SEtienne Carriere ANY_PART),
81512cbf1dSJens Wiklander MECHANISM(PKCS11_CKM_AES_CBC_ENCRYPT_DATA, PKCS11_CKFM_DERIVE,
82512cbf1dSJens Wiklander ANY_PART),
83512cbf1dSJens Wiklander MECHANISM(PKCS11_CKM_AES_KEY_GEN, PKCS11_CKFM_GENERATE, ANY_PART),
84fa247a2aSRuchika Gupta MECHANISM(PKCS11_CKM_GENERIC_SECRET_KEY_GEN, PKCS11_CKFM_GENERATE,
85fa247a2aSRuchika Gupta ANY_PART),
869e91a619SVesa Jääskeläinen /* Digest */
879e91a619SVesa Jääskeläinen MECHANISM(PKCS11_CKM_MD5, PKCS11_CKFM_DIGEST, ANY_PART),
889e91a619SVesa Jääskeläinen MECHANISM(PKCS11_CKM_SHA_1, PKCS11_CKFM_DIGEST, ANY_PART),
899e91a619SVesa Jääskeläinen MECHANISM(PKCS11_CKM_SHA224, PKCS11_CKFM_DIGEST, ANY_PART),
909e91a619SVesa Jääskeläinen MECHANISM(PKCS11_CKM_SHA256, PKCS11_CKFM_DIGEST, ANY_PART),
919e91a619SVesa Jääskeläinen MECHANISM(PKCS11_CKM_SHA384, PKCS11_CKFM_DIGEST, ANY_PART),
929e91a619SVesa Jääskeläinen MECHANISM(PKCS11_CKM_SHA512, PKCS11_CKFM_DIGEST, ANY_PART),
93689f4e5bSRuchika Gupta /* HMAC */
94689f4e5bSRuchika Gupta MECHANISM(PKCS11_CKM_MD5_HMAC, CKFM_AUTH_NO_RECOVER, ANY_PART),
95689f4e5bSRuchika Gupta MECHANISM(PKCS11_CKM_SHA_1_HMAC, CKFM_AUTH_NO_RECOVER, ANY_PART),
96689f4e5bSRuchika Gupta MECHANISM(PKCS11_CKM_SHA224_HMAC, CKFM_AUTH_NO_RECOVER, ANY_PART),
97689f4e5bSRuchika Gupta MECHANISM(PKCS11_CKM_SHA256_HMAC, CKFM_AUTH_NO_RECOVER, ANY_PART),
98689f4e5bSRuchika Gupta MECHANISM(PKCS11_CKM_SHA384_HMAC, CKFM_AUTH_NO_RECOVER, ANY_PART),
99689f4e5bSRuchika Gupta MECHANISM(PKCS11_CKM_SHA512_HMAC, CKFM_AUTH_NO_RECOVER, ANY_PART),
10070b6683bSVictor Chong MECHANISM(PKCS11_CKM_MD5_HMAC_GENERAL, CKFM_AUTH_NO_RECOVER, ANY_PART),
10170b6683bSVictor Chong MECHANISM(PKCS11_CKM_SHA_1_HMAC_GENERAL, CKFM_AUTH_NO_RECOVER,
10270b6683bSVictor Chong ANY_PART),
10370b6683bSVictor Chong MECHANISM(PKCS11_CKM_SHA224_HMAC_GENERAL, CKFM_AUTH_NO_RECOVER,
10470b6683bSVictor Chong ANY_PART),
10570b6683bSVictor Chong MECHANISM(PKCS11_CKM_SHA256_HMAC_GENERAL, CKFM_AUTH_NO_RECOVER,
10670b6683bSVictor Chong ANY_PART),
10770b6683bSVictor Chong MECHANISM(PKCS11_CKM_SHA384_HMAC_GENERAL, CKFM_AUTH_NO_RECOVER,
10870b6683bSVictor Chong ANY_PART),
10970b6683bSVictor Chong MECHANISM(PKCS11_CKM_SHA512_HMAC_GENERAL, CKFM_AUTH_NO_RECOVER,
11070b6683bSVictor Chong ANY_PART),
11102b16804SVesa Jääskeläinen /* EC */
11202b16804SVesa Jääskeläinen MECHANISM(PKCS11_CKM_EC_KEY_PAIR_GEN, PKCS11_CKFM_GENERATE_KEY_PAIR,
11302b16804SVesa Jääskeläinen ANY_PART),
114cc062b46SJorge Ramirez-Ortiz MECHANISM(PKCS11_CKM_ECDH1_DERIVE, PKCS11_CKFM_DERIVE,
115cc062b46SJorge Ramirez-Ortiz ANY_PART),
116fb279d8bSVesa Jääskeläinen MECHANISM(PKCS11_CKM_ECDSA, CKFM_AUTH_NO_RECOVER, SINGLE_PART_ONLY),
117fb279d8bSVesa Jääskeläinen MECHANISM(PKCS11_CKM_ECDSA_SHA1, CKFM_AUTH_NO_RECOVER, ANY_PART),
118fb279d8bSVesa Jääskeläinen MECHANISM(PKCS11_CKM_ECDSA_SHA224, CKFM_AUTH_NO_RECOVER, ANY_PART),
119fb279d8bSVesa Jääskeläinen MECHANISM(PKCS11_CKM_ECDSA_SHA256, CKFM_AUTH_NO_RECOVER, ANY_PART),
120fb279d8bSVesa Jääskeläinen MECHANISM(PKCS11_CKM_ECDSA_SHA384, CKFM_AUTH_NO_RECOVER, ANY_PART),
121fb279d8bSVesa Jääskeläinen MECHANISM(PKCS11_CKM_ECDSA_SHA512, CKFM_AUTH_NO_RECOVER, ANY_PART),
12203e07432SValerii Chubar /* EDDSA */
12303e07432SValerii Chubar MECHANISM(PKCS11_CKM_EC_EDWARDS_KEY_PAIR_GEN,
12403e07432SValerii Chubar PKCS11_CKFM_GENERATE_KEY_PAIR, ANY_PART),
12503e07432SValerii Chubar MECHANISM(PKCS11_CKM_EDDSA, CKFM_AUTH_NO_RECOVER, ANY_PART),
12686922832SVesa Jääskeläinen /* RSA */
12745d40bdaSValerii Chubar MECHANISM(PKCS11_CKM_RSA_AES_KEY_WRAP, CKFM_CIPHER_WRAP,
12845d40bdaSValerii Chubar SINGLE_PART_ONLY),
12986922832SVesa Jääskeläinen MECHANISM(PKCS11_CKM_RSA_PKCS_KEY_PAIR_GEN,
13086922832SVesa Jääskeläinen PKCS11_CKFM_GENERATE_KEY_PAIR, ANY_PART),
1310442c956SVesa Jääskeläinen MECHANISM(PKCS11_CKM_RSA_PKCS, CKFM_CIPHER_WRAP | CKFM_AUTH_NO_RECOVER |
1320442c956SVesa Jääskeläinen CKFM_AUTH_WITH_RECOVER, SINGLE_PART_ONLY),
133dc8c77fcSVesa Jääskeläinen MECHANISM(PKCS11_CKM_RSA_PKCS_OAEP, CKFM_CIPHER_WRAP,
134dc8c77fcSVesa Jääskeläinen SINGLE_PART_ONLY),
135e02f17f3SAlexandre Marechal MECHANISM(PKCS11_CKM_RSA_X_509, CKFM_CIPHER_WRAP |
136e02f17f3SAlexandre Marechal CKFM_AUTH_NO_RECOVER | CKFM_AUTH_WITH_RECOVER,
137e02f17f3SAlexandre Marechal SINGLE_PART_ONLY),
138d9af50bcSVesa Jääskeläinen MECHANISM(PKCS11_CKM_RSA_PKCS_PSS, CKFM_AUTH_NO_RECOVER,
139d9af50bcSVesa Jääskeläinen SINGLE_PART_ONLY),
1400442c956SVesa Jääskeläinen MECHANISM(PKCS11_CKM_MD5_RSA_PKCS, CKFM_AUTH_NO_RECOVER, ANY_PART),
1410442c956SVesa Jääskeläinen MECHANISM(PKCS11_CKM_SHA1_RSA_PKCS, CKFM_AUTH_NO_RECOVER, ANY_PART),
142d9af50bcSVesa Jääskeläinen MECHANISM(PKCS11_CKM_SHA1_RSA_PKCS_PSS, CKFM_AUTH_NO_RECOVER, ANY_PART),
1430442c956SVesa Jääskeläinen MECHANISM(PKCS11_CKM_SHA256_RSA_PKCS, CKFM_AUTH_NO_RECOVER, ANY_PART),
1440442c956SVesa Jääskeläinen MECHANISM(PKCS11_CKM_SHA384_RSA_PKCS, CKFM_AUTH_NO_RECOVER, ANY_PART),
1450442c956SVesa Jääskeläinen MECHANISM(PKCS11_CKM_SHA512_RSA_PKCS, CKFM_AUTH_NO_RECOVER, ANY_PART),
146d9af50bcSVesa Jääskeläinen MECHANISM(PKCS11_CKM_SHA256_RSA_PKCS_PSS, CKFM_AUTH_NO_RECOVER,
147d9af50bcSVesa Jääskeläinen ANY_PART),
148d9af50bcSVesa Jääskeläinen MECHANISM(PKCS11_CKM_SHA384_RSA_PKCS_PSS, CKFM_AUTH_NO_RECOVER,
149d9af50bcSVesa Jääskeläinen ANY_PART),
150d9af50bcSVesa Jääskeläinen MECHANISM(PKCS11_CKM_SHA512_RSA_PKCS_PSS, CKFM_AUTH_NO_RECOVER,
151d9af50bcSVesa Jääskeläinen ANY_PART),
1520442c956SVesa Jääskeläinen MECHANISM(PKCS11_CKM_SHA224_RSA_PKCS, CKFM_AUTH_NO_RECOVER, ANY_PART),
153d9af50bcSVesa Jääskeläinen MECHANISM(PKCS11_CKM_SHA224_RSA_PKCS_PSS, CKFM_AUTH_NO_RECOVER,
154d9af50bcSVesa Jääskeläinen ANY_PART),
1558849c126SEtienne Carriere };
1568849c126SEtienne Carriere
1578849c126SEtienne Carriere #if CFG_TEE_TA_LOG_LEVEL > 0
mechanism_string_id(enum pkcs11_mechanism_id id)1588849c126SEtienne Carriere const char *mechanism_string_id(enum pkcs11_mechanism_id id)
1598849c126SEtienne Carriere {
1608849c126SEtienne Carriere const size_t offset = sizeof("PKCS11_CKM_") - 1;
1618849c126SEtienne Carriere size_t n = 0;
1628849c126SEtienne Carriere
1638849c126SEtienne Carriere for (n = 0; n < ARRAY_SIZE(pkcs11_modes); n++)
1648849c126SEtienne Carriere if (pkcs11_modes[n].id == id)
1658849c126SEtienne Carriere return pkcs11_modes[n].string + offset;
1668849c126SEtienne Carriere
1678849c126SEtienne Carriere return "Unknown ID";
1688849c126SEtienne Carriere }
1698849c126SEtienne Carriere #endif /*CFG_TEE_TA_LOG_LEVEL*/
1708849c126SEtienne Carriere
1718849c126SEtienne Carriere /*
1728849c126SEtienne Carriere * Return true if @id is a valid mechanism ID
1738849c126SEtienne Carriere */
mechanism_is_valid(enum pkcs11_mechanism_id id)1748849c126SEtienne Carriere bool mechanism_is_valid(enum pkcs11_mechanism_id id)
1758849c126SEtienne Carriere {
1768849c126SEtienne Carriere size_t n = 0;
1778849c126SEtienne Carriere
1788849c126SEtienne Carriere for (n = 0; n < ARRAY_SIZE(pkcs11_modes); n++)
1798849c126SEtienne Carriere if (id == pkcs11_modes[n].id)
1808849c126SEtienne Carriere return true;
1818849c126SEtienne Carriere
1828849c126SEtienne Carriere return false;
1838849c126SEtienne Carriere }
1848849c126SEtienne Carriere
1858849c126SEtienne Carriere /*
1868849c126SEtienne Carriere * Return true if mechanism ID is valid and flags matches PKCS#11 compliancy
1878849c126SEtienne Carriere */
mechanism_flags_complies_pkcs11(uint32_t mechanism_type,uint32_t flags)1888849c126SEtienne Carriere bool __maybe_unused mechanism_flags_complies_pkcs11(uint32_t mechanism_type,
1898849c126SEtienne Carriere uint32_t flags)
1908849c126SEtienne Carriere {
1918849c126SEtienne Carriere size_t n = 0;
1928849c126SEtienne Carriere
1938849c126SEtienne Carriere assert((flags & ~ALLOWED_PKCS11_CKFM) == 0);
1948849c126SEtienne Carriere
1958849c126SEtienne Carriere for (n = 0; n < ARRAY_SIZE(pkcs11_modes); n++) {
1968849c126SEtienne Carriere if (pkcs11_modes[n].id == mechanism_type) {
1978849c126SEtienne Carriere if (flags & ~pkcs11_modes[n].flags)
1988849c126SEtienne Carriere EMSG("%s flags: 0x%"PRIx32" vs 0x%"PRIx32,
1998849c126SEtienne Carriere id2str_mechanism(mechanism_type),
2008849c126SEtienne Carriere flags, pkcs11_modes[n].flags);
2018849c126SEtienne Carriere
2028849c126SEtienne Carriere return (flags & ~pkcs11_modes[n].flags) == 0;
2038849c126SEtienne Carriere }
2048849c126SEtienne Carriere }
2058849c126SEtienne Carriere
2068849c126SEtienne Carriere /* Mechanism ID unexpectedly not found */
2078849c126SEtienne Carriere return false;
2088849c126SEtienne Carriere }
2098849c126SEtienne Carriere
mechanism_is_one_shot_only(uint32_t mechanism_type)210512cbf1dSJens Wiklander bool mechanism_is_one_shot_only(uint32_t mechanism_type)
211512cbf1dSJens Wiklander {
212512cbf1dSJens Wiklander size_t n = 0;
213512cbf1dSJens Wiklander
214512cbf1dSJens Wiklander for (n = 0; n < ARRAY_SIZE(pkcs11_modes); n++)
215512cbf1dSJens Wiklander if (pkcs11_modes[n].id == mechanism_type)
216512cbf1dSJens Wiklander return pkcs11_modes[n].one_shot;
217512cbf1dSJens Wiklander
218512cbf1dSJens Wiklander /* Mechanism ID unexpectedly not found */
219512cbf1dSJens Wiklander TEE_Panic(PKCS11_RV_NOT_FOUND);
220512cbf1dSJens Wiklander /* Dummy return to keep compiler happy */
221512cbf1dSJens Wiklander return false;
222512cbf1dSJens Wiklander }
223512cbf1dSJens Wiklander
224512cbf1dSJens Wiklander /*
225512cbf1dSJens Wiklander * Field single_part_only is unused from array token_mechanism[], hence
226512cbf1dSJens Wiklander * simply use ANY_PART for all mechanism there.
227512cbf1dSJens Wiklander */
228512cbf1dSJens Wiklander #define TA_MECHANISM(_label, _flags) MECHANISM((_label), (_flags), ANY_PART)
229512cbf1dSJens Wiklander
2308849c126SEtienne Carriere /*
2318849c126SEtienne Carriere * Arrays that centralizes the IDs and processing flags for mechanisms
232c95980b1SEtienne Carriere * supported by each embedded token.
2338849c126SEtienne Carriere */
2348849c126SEtienne Carriere const struct pkcs11_mechachism_modes token_mechanism[] = {
2355f80f270SRuchika Gupta TA_MECHANISM(PKCS11_CKM_AES_ECB, CKFM_CIPHER_WRAP),
2365f80f270SRuchika Gupta TA_MECHANISM(PKCS11_CKM_AES_CBC, CKFM_CIPHER_WRAP),
237512cbf1dSJens Wiklander TA_MECHANISM(PKCS11_CKM_AES_CTR, CKFM_CIPHER),
23863778faaSEtienne Carriere TA_MECHANISM(PKCS11_CKM_AES_GCM, CKFM_CIPHER),
239512cbf1dSJens Wiklander TA_MECHANISM(PKCS11_CKM_AES_CTS, CKFM_CIPHER),
2400ef6b144SVictor Chong TA_MECHANISM(PKCS11_CKM_AES_CMAC, CKFM_AUTH_NO_RECOVER),
2410ef6b144SVictor Chong TA_MECHANISM(PKCS11_CKM_AES_CMAC_GENERAL, CKFM_AUTH_NO_RECOVER),
242512cbf1dSJens Wiklander TA_MECHANISM(PKCS11_CKM_AES_ECB_ENCRYPT_DATA, PKCS11_CKFM_DERIVE),
243512cbf1dSJens Wiklander TA_MECHANISM(PKCS11_CKM_AES_CBC_ENCRYPT_DATA, PKCS11_CKFM_DERIVE),
244cc062b46SJorge Ramirez-Ortiz TA_MECHANISM(PKCS11_CKM_ECDH1_DERIVE, PKCS11_CKFM_DERIVE),
245fa247a2aSRuchika Gupta TA_MECHANISM(PKCS11_CKM_AES_KEY_GEN, PKCS11_CKFM_GENERATE),
246fa247a2aSRuchika Gupta TA_MECHANISM(PKCS11_CKM_GENERIC_SECRET_KEY_GEN, PKCS11_CKFM_GENERATE),
2479e91a619SVesa Jääskeläinen TA_MECHANISM(PKCS11_CKM_MD5, PKCS11_CKFM_DIGEST),
2489e91a619SVesa Jääskeläinen TA_MECHANISM(PKCS11_CKM_SHA_1, PKCS11_CKFM_DIGEST),
2499e91a619SVesa Jääskeläinen TA_MECHANISM(PKCS11_CKM_SHA224, PKCS11_CKFM_DIGEST),
2509e91a619SVesa Jääskeläinen TA_MECHANISM(PKCS11_CKM_SHA256, PKCS11_CKFM_DIGEST),
2519e91a619SVesa Jääskeläinen TA_MECHANISM(PKCS11_CKM_SHA384, PKCS11_CKFM_DIGEST),
2529e91a619SVesa Jääskeläinen TA_MECHANISM(PKCS11_CKM_SHA512, PKCS11_CKFM_DIGEST),
253689f4e5bSRuchika Gupta TA_MECHANISM(PKCS11_CKM_MD5_HMAC, CKFM_AUTH_NO_RECOVER),
254689f4e5bSRuchika Gupta TA_MECHANISM(PKCS11_CKM_SHA_1_HMAC, CKFM_AUTH_NO_RECOVER),
255689f4e5bSRuchika Gupta TA_MECHANISM(PKCS11_CKM_SHA224_HMAC, CKFM_AUTH_NO_RECOVER),
256689f4e5bSRuchika Gupta TA_MECHANISM(PKCS11_CKM_SHA256_HMAC, CKFM_AUTH_NO_RECOVER),
257689f4e5bSRuchika Gupta TA_MECHANISM(PKCS11_CKM_SHA384_HMAC, CKFM_AUTH_NO_RECOVER),
258689f4e5bSRuchika Gupta TA_MECHANISM(PKCS11_CKM_SHA512_HMAC, CKFM_AUTH_NO_RECOVER),
25970b6683bSVictor Chong TA_MECHANISM(PKCS11_CKM_MD5_HMAC_GENERAL, CKFM_AUTH_NO_RECOVER),
26070b6683bSVictor Chong TA_MECHANISM(PKCS11_CKM_SHA_1_HMAC_GENERAL, CKFM_AUTH_NO_RECOVER),
26170b6683bSVictor Chong TA_MECHANISM(PKCS11_CKM_SHA224_HMAC_GENERAL, CKFM_AUTH_NO_RECOVER),
26270b6683bSVictor Chong TA_MECHANISM(PKCS11_CKM_SHA256_HMAC_GENERAL, CKFM_AUTH_NO_RECOVER),
26370b6683bSVictor Chong TA_MECHANISM(PKCS11_CKM_SHA384_HMAC_GENERAL, CKFM_AUTH_NO_RECOVER),
26470b6683bSVictor Chong TA_MECHANISM(PKCS11_CKM_SHA512_HMAC_GENERAL, CKFM_AUTH_NO_RECOVER),
26502b16804SVesa Jääskeläinen TA_MECHANISM(PKCS11_CKM_EC_KEY_PAIR_GEN,
26602b16804SVesa Jääskeläinen PKCS11_CKFM_GENERATE_KEY_PAIR),
26703e07432SValerii Chubar TA_MECHANISM(PKCS11_CKM_EC_EDWARDS_KEY_PAIR_GEN,
26803e07432SValerii Chubar PKCS11_CKFM_GENERATE_KEY_PAIR),
269fb279d8bSVesa Jääskeläinen TA_MECHANISM(PKCS11_CKM_ECDSA, CKFM_AUTH_NO_RECOVER),
270fb279d8bSVesa Jääskeläinen TA_MECHANISM(PKCS11_CKM_ECDSA_SHA1, CKFM_AUTH_NO_RECOVER),
271fb279d8bSVesa Jääskeläinen TA_MECHANISM(PKCS11_CKM_ECDSA_SHA224, CKFM_AUTH_NO_RECOVER),
272fb279d8bSVesa Jääskeläinen TA_MECHANISM(PKCS11_CKM_ECDSA_SHA256, CKFM_AUTH_NO_RECOVER),
273fb279d8bSVesa Jääskeläinen TA_MECHANISM(PKCS11_CKM_ECDSA_SHA384, CKFM_AUTH_NO_RECOVER),
274fb279d8bSVesa Jääskeläinen TA_MECHANISM(PKCS11_CKM_ECDSA_SHA512, CKFM_AUTH_NO_RECOVER),
27503e07432SValerii Chubar TA_MECHANISM(PKCS11_CKM_EDDSA, CKFM_AUTH_NO_RECOVER),
27645d40bdaSValerii Chubar TA_MECHANISM(PKCS11_CKM_RSA_AES_KEY_WRAP, CKFM_CIPHER_WRAP),
27786922832SVesa Jääskeläinen TA_MECHANISM(PKCS11_CKM_RSA_PKCS_KEY_PAIR_GEN,
27886922832SVesa Jääskeläinen PKCS11_CKFM_GENERATE_KEY_PAIR),
2790442c956SVesa Jääskeläinen TA_MECHANISM(PKCS11_CKM_RSA_PKCS, CKFM_CIPHER | CKFM_AUTH_NO_RECOVER),
280e02f17f3SAlexandre Marechal #ifdef CFG_PKCS11_TA_RSA_X_509
281b7abff72SEtienne Carriere TA_MECHANISM(PKCS11_CKM_RSA_X_509, CKFM_CIPHER | CKFM_AUTH_NO_RECOVER),
282e02f17f3SAlexandre Marechal #endif
283d9af50bcSVesa Jääskeläinen TA_MECHANISM(PKCS11_CKM_RSA_PKCS_PSS, CKFM_AUTH_NO_RECOVER),
2840442c956SVesa Jääskeläinen TA_MECHANISM(PKCS11_CKM_MD5_RSA_PKCS, CKFM_AUTH_NO_RECOVER),
2850442c956SVesa Jääskeläinen TA_MECHANISM(PKCS11_CKM_SHA1_RSA_PKCS, CKFM_AUTH_NO_RECOVER),
286dc8c77fcSVesa Jääskeläinen TA_MECHANISM(PKCS11_CKM_RSA_PKCS_OAEP, CKFM_CIPHER),
287d9af50bcSVesa Jääskeläinen TA_MECHANISM(PKCS11_CKM_SHA1_RSA_PKCS_PSS, CKFM_AUTH_NO_RECOVER),
2880442c956SVesa Jääskeläinen TA_MECHANISM(PKCS11_CKM_SHA256_RSA_PKCS, CKFM_AUTH_NO_RECOVER),
2890442c956SVesa Jääskeläinen TA_MECHANISM(PKCS11_CKM_SHA384_RSA_PKCS, CKFM_AUTH_NO_RECOVER),
2900442c956SVesa Jääskeläinen TA_MECHANISM(PKCS11_CKM_SHA512_RSA_PKCS, CKFM_AUTH_NO_RECOVER),
291d9af50bcSVesa Jääskeläinen TA_MECHANISM(PKCS11_CKM_SHA256_RSA_PKCS_PSS, CKFM_AUTH_NO_RECOVER),
292d9af50bcSVesa Jääskeläinen TA_MECHANISM(PKCS11_CKM_SHA384_RSA_PKCS_PSS, CKFM_AUTH_NO_RECOVER),
293d9af50bcSVesa Jääskeläinen TA_MECHANISM(PKCS11_CKM_SHA512_RSA_PKCS_PSS, CKFM_AUTH_NO_RECOVER),
2940442c956SVesa Jääskeläinen TA_MECHANISM(PKCS11_CKM_SHA224_RSA_PKCS, CKFM_AUTH_NO_RECOVER),
295d9af50bcSVesa Jääskeläinen TA_MECHANISM(PKCS11_CKM_SHA224_RSA_PKCS_PSS, CKFM_AUTH_NO_RECOVER),
2968849c126SEtienne Carriere };
2978849c126SEtienne Carriere
2988849c126SEtienne Carriere /*
2998849c126SEtienne Carriere * tee_malloc_mechanism_array - Allocate and fill array of supported mechanisms
3008849c126SEtienne Carriere * @count: [in] [out] Pointer to number of mechanism IDs in client resource
3018849c126SEtienne Carriere * Return allocated array of the supported mechanism IDs
3028849c126SEtienne Carriere *
3038849c126SEtienne Carriere * Allocates array with 32bit cells mechanism IDs for the supported ones only
3048849c126SEtienne Carriere * if *@count covers number mechanism IDs exposed.
3058849c126SEtienne Carriere */
tee_malloc_mechanism_list(size_t * out_count)3068849c126SEtienne Carriere uint32_t *tee_malloc_mechanism_list(size_t *out_count)
3078849c126SEtienne Carriere {
3088849c126SEtienne Carriere size_t n = 0;
3098849c126SEtienne Carriere size_t count = 0;
3108849c126SEtienne Carriere uint32_t *array = NULL;
3118849c126SEtienne Carriere
3128849c126SEtienne Carriere for (n = 0; n < ARRAY_SIZE(token_mechanism); n++)
3138849c126SEtienne Carriere if (token_mechanism[n].flags)
3148849c126SEtienne Carriere count++;
3158849c126SEtienne Carriere
3168849c126SEtienne Carriere if (*out_count >= count)
3178849c126SEtienne Carriere array = TEE_Malloc(count * sizeof(*array),
3188849c126SEtienne Carriere TEE_USER_MEM_HINT_NO_FILL_ZERO);
3198849c126SEtienne Carriere
3208849c126SEtienne Carriere *out_count = count;
3218849c126SEtienne Carriere
3228849c126SEtienne Carriere if (!array)
3238849c126SEtienne Carriere return NULL;
3248849c126SEtienne Carriere
3258849c126SEtienne Carriere for (n = 0; n < ARRAY_SIZE(token_mechanism); n++) {
3268849c126SEtienne Carriere if (token_mechanism[n].flags) {
3278849c126SEtienne Carriere count--;
3288849c126SEtienne Carriere array[count] = token_mechanism[n].id;
3298849c126SEtienne Carriere }
3308849c126SEtienne Carriere }
3318849c126SEtienne Carriere assert(!count);
3328849c126SEtienne Carriere
3338849c126SEtienne Carriere return array;
3348849c126SEtienne Carriere }
3358849c126SEtienne Carriere
mechanism_supported_flags(enum pkcs11_mechanism_id id)3368849c126SEtienne Carriere uint32_t mechanism_supported_flags(enum pkcs11_mechanism_id id)
3378849c126SEtienne Carriere {
3388849c126SEtienne Carriere size_t n = 0;
3398849c126SEtienne Carriere
3408849c126SEtienne Carriere for (n = 0; n < ARRAY_SIZE(token_mechanism); n++) {
3418849c126SEtienne Carriere if (id == token_mechanism[n].id) {
3428849c126SEtienne Carriere uint32_t flags = token_mechanism[n].flags;
3438849c126SEtienne Carriere
3448849c126SEtienne Carriere assert(mechanism_flags_complies_pkcs11(id, flags));
3458849c126SEtienne Carriere return flags;
3468849c126SEtienne Carriere }
3478849c126SEtienne Carriere }
3488849c126SEtienne Carriere
3498849c126SEtienne Carriere return 0;
3508849c126SEtienne Carriere }
351512cbf1dSJens Wiklander
pkcs11_mechanism_supported_key_sizes(uint32_t proc_id,uint32_t * min_key_size,uint32_t * max_key_size)3522d0cd829SRuchika Gupta void pkcs11_mechanism_supported_key_sizes(uint32_t proc_id,
3532d0cd829SRuchika Gupta uint32_t *min_key_size,
354512cbf1dSJens Wiklander uint32_t *max_key_size)
355512cbf1dSJens Wiklander {
356512cbf1dSJens Wiklander switch (proc_id) {
357fa247a2aSRuchika Gupta case PKCS11_CKM_GENERIC_SECRET_KEY_GEN:
358fa247a2aSRuchika Gupta /* This mechanism expects the keysize to be returned in bits */
359fa247a2aSRuchika Gupta *min_key_size = 1; /* in bits */
360fa247a2aSRuchika Gupta *max_key_size = 4096; /* in bits */
361fa247a2aSRuchika Gupta break;
362689f4e5bSRuchika Gupta case PKCS11_CKM_MD5_HMAC:
36370b6683bSVictor Chong case PKCS11_CKM_MD5_HMAC_GENERAL:
364d92c3cddSRuchika Gupta *min_key_size = 8;
365d92c3cddSRuchika Gupta *max_key_size = 64;
366689f4e5bSRuchika Gupta break;
367689f4e5bSRuchika Gupta case PKCS11_CKM_SHA_1_HMAC:
36870b6683bSVictor Chong case PKCS11_CKM_SHA_1_HMAC_GENERAL:
369d92c3cddSRuchika Gupta *min_key_size = 10;
370d92c3cddSRuchika Gupta *max_key_size = 64;
371689f4e5bSRuchika Gupta break;
372689f4e5bSRuchika Gupta case PKCS11_CKM_SHA224_HMAC:
37370b6683bSVictor Chong case PKCS11_CKM_SHA224_HMAC_GENERAL:
374d92c3cddSRuchika Gupta *min_key_size = 14;
375d92c3cddSRuchika Gupta *max_key_size = 64;
376689f4e5bSRuchika Gupta break;
377689f4e5bSRuchika Gupta case PKCS11_CKM_SHA256_HMAC:
37870b6683bSVictor Chong case PKCS11_CKM_SHA256_HMAC_GENERAL:
379d92c3cddSRuchika Gupta *min_key_size = 24;
380d92c3cddSRuchika Gupta *max_key_size = 128;
381689f4e5bSRuchika Gupta break;
382689f4e5bSRuchika Gupta case PKCS11_CKM_SHA384_HMAC:
38370b6683bSVictor Chong case PKCS11_CKM_SHA384_HMAC_GENERAL:
384d92c3cddSRuchika Gupta *min_key_size = 32;
385d92c3cddSRuchika Gupta *max_key_size = 128;
386689f4e5bSRuchika Gupta break;
387689f4e5bSRuchika Gupta case PKCS11_CKM_SHA512_HMAC:
38870b6683bSVictor Chong case PKCS11_CKM_SHA512_HMAC_GENERAL:
389d92c3cddSRuchika Gupta *min_key_size = 32;
390d92c3cddSRuchika Gupta *max_key_size = 128;
391689f4e5bSRuchika Gupta break;
392512cbf1dSJens Wiklander case PKCS11_CKM_AES_KEY_GEN:
393512cbf1dSJens Wiklander case PKCS11_CKM_AES_ECB:
394512cbf1dSJens Wiklander case PKCS11_CKM_AES_CBC:
395512cbf1dSJens Wiklander case PKCS11_CKM_AES_CBC_PAD:
396512cbf1dSJens Wiklander case PKCS11_CKM_AES_CTR:
39763778faaSEtienne Carriere case PKCS11_CKM_AES_GCM:
398512cbf1dSJens Wiklander case PKCS11_CKM_AES_CTS:
3990ef6b144SVictor Chong case PKCS11_CKM_AES_CMAC:
4000ef6b144SVictor Chong case PKCS11_CKM_AES_CMAC_GENERAL:
401512cbf1dSJens Wiklander *min_key_size = 16;
402512cbf1dSJens Wiklander *max_key_size = 32;
403512cbf1dSJens Wiklander break;
40402b16804SVesa Jääskeläinen case PKCS11_CKM_EC_KEY_PAIR_GEN:
405fb279d8bSVesa Jääskeläinen case PKCS11_CKM_ECDSA:
406fb279d8bSVesa Jääskeläinen case PKCS11_CKM_ECDSA_SHA1:
407fb279d8bSVesa Jääskeläinen case PKCS11_CKM_ECDSA_SHA224:
408fb279d8bSVesa Jääskeläinen case PKCS11_CKM_ECDSA_SHA256:
409fb279d8bSVesa Jääskeläinen case PKCS11_CKM_ECDSA_SHA384:
410fb279d8bSVesa Jääskeläinen case PKCS11_CKM_ECDSA_SHA512:
411cc062b46SJorge Ramirez-Ortiz case PKCS11_CKM_ECDH1_DERIVE:
41202b16804SVesa Jääskeläinen *min_key_size = 160; /* in bits */
41302b16804SVesa Jääskeläinen *max_key_size = 521; /* in bits */
41402b16804SVesa Jääskeläinen break;
41503e07432SValerii Chubar case PKCS11_CKM_EC_EDWARDS_KEY_PAIR_GEN:
41603e07432SValerii Chubar case PKCS11_CKM_EDDSA:
41703e07432SValerii Chubar *min_key_size = 256; /* in bits */
41803e07432SValerii Chubar *max_key_size = 448; /* in bits */
41903e07432SValerii Chubar break;
42086922832SVesa Jääskeläinen case PKCS11_CKM_RSA_PKCS_KEY_PAIR_GEN:
4210442c956SVesa Jääskeläinen case PKCS11_CKM_RSA_PKCS:
422e02f17f3SAlexandre Marechal case PKCS11_CKM_RSA_X_509:
4230442c956SVesa Jääskeläinen case PKCS11_CKM_MD5_RSA_PKCS:
4240442c956SVesa Jääskeläinen case PKCS11_CKM_SHA1_RSA_PKCS:
425dc8c77fcSVesa Jääskeläinen case PKCS11_CKM_RSA_PKCS_OAEP:
426d9af50bcSVesa Jääskeläinen case PKCS11_CKM_SHA1_RSA_PKCS_PSS:
4270442c956SVesa Jääskeläinen case PKCS11_CKM_SHA256_RSA_PKCS:
4280442c956SVesa Jääskeläinen case PKCS11_CKM_SHA384_RSA_PKCS:
4290442c956SVesa Jääskeläinen case PKCS11_CKM_SHA512_RSA_PKCS:
430d9af50bcSVesa Jääskeläinen case PKCS11_CKM_SHA256_RSA_PKCS_PSS:
431d9af50bcSVesa Jääskeläinen case PKCS11_CKM_SHA384_RSA_PKCS_PSS:
432d9af50bcSVesa Jääskeläinen case PKCS11_CKM_SHA512_RSA_PKCS_PSS:
4330442c956SVesa Jääskeläinen case PKCS11_CKM_SHA224_RSA_PKCS:
434d9af50bcSVesa Jääskeläinen case PKCS11_CKM_SHA224_RSA_PKCS_PSS:
43586922832SVesa Jääskeläinen *min_key_size = 256; /* in bits */
43686922832SVesa Jääskeläinen *max_key_size = 4096; /* in bits */
43786922832SVesa Jääskeläinen break;
438512cbf1dSJens Wiklander default:
439512cbf1dSJens Wiklander *min_key_size = 0;
440512cbf1dSJens Wiklander *max_key_size = 0;
441512cbf1dSJens Wiklander break;
442512cbf1dSJens Wiklander }
443512cbf1dSJens Wiklander }
4442d0cd829SRuchika Gupta
mechanism_supported_key_sizes_bytes(uint32_t proc_id,uint32_t * min_key_size,uint32_t * max_key_size)4452d0cd829SRuchika Gupta void mechanism_supported_key_sizes_bytes(uint32_t proc_id,
4462d0cd829SRuchika Gupta uint32_t *min_key_size,
4472d0cd829SRuchika Gupta uint32_t *max_key_size)
4482d0cd829SRuchika Gupta {
4492d0cd829SRuchika Gupta pkcs11_mechanism_supported_key_sizes(proc_id, min_key_size,
4502d0cd829SRuchika Gupta max_key_size);
4512d0cd829SRuchika Gupta
452db28c542SVesa Jääskeläinen switch (proc_id) {
453db28c542SVesa Jääskeläinen case PKCS11_CKM_GENERIC_SECRET_KEY_GEN:
45403e07432SValerii Chubar case PKCS11_CKM_EC_EDWARDS_KEY_PAIR_GEN:
455db28c542SVesa Jääskeläinen case PKCS11_CKM_EC_KEY_PAIR_GEN:
456db28c542SVesa Jääskeläinen case PKCS11_CKM_ECDSA:
45703e07432SValerii Chubar case PKCS11_CKM_EDDSA:
458db28c542SVesa Jääskeläinen case PKCS11_CKM_ECDSA_SHA1:
459db28c542SVesa Jääskeläinen case PKCS11_CKM_ECDSA_SHA224:
460db28c542SVesa Jääskeläinen case PKCS11_CKM_ECDSA_SHA256:
461db28c542SVesa Jääskeläinen case PKCS11_CKM_ECDSA_SHA384:
462db28c542SVesa Jääskeläinen case PKCS11_CKM_ECDSA_SHA512:
46386922832SVesa Jääskeläinen case PKCS11_CKM_RSA_PKCS_KEY_PAIR_GEN:
464db28c542SVesa Jääskeläinen /* Size is in bits -> convert to bytes and ceil */
465*04e46975SEtienne Carriere *min_key_size = ROUNDUP_DIV(*min_key_size, 8);
466*04e46975SEtienne Carriere *max_key_size = ROUNDUP_DIV(*max_key_size, 8);
467db28c542SVesa Jääskeläinen break;
468db28c542SVesa Jääskeläinen default:
469db28c542SVesa Jääskeläinen /* Size is already in bytes */
470db28c542SVesa Jääskeläinen break;
4712d0cd829SRuchika Gupta }
4722d0cd829SRuchika Gupta }
473