xref: /optee_os/ta/pkcs11/src/token_capabilities.c (revision 63778faac4b7d8917d6170104c2c20a3a78dad9f)
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),
76*63778faaSEtienne 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),
135d9af50bcSVesa Jääskeläinen 	MECHANISM(PKCS11_CKM_RSA_PKCS_PSS, CKFM_AUTH_NO_RECOVER,
136d9af50bcSVesa Jääskeläinen 		  SINGLE_PART_ONLY),
1370442c956SVesa Jääskeläinen 	MECHANISM(PKCS11_CKM_MD5_RSA_PKCS, CKFM_AUTH_NO_RECOVER, ANY_PART),
1380442c956SVesa Jääskeläinen 	MECHANISM(PKCS11_CKM_SHA1_RSA_PKCS, CKFM_AUTH_NO_RECOVER, ANY_PART),
139d9af50bcSVesa Jääskeläinen 	MECHANISM(PKCS11_CKM_SHA1_RSA_PKCS_PSS, CKFM_AUTH_NO_RECOVER, ANY_PART),
1400442c956SVesa Jääskeläinen 	MECHANISM(PKCS11_CKM_SHA256_RSA_PKCS, CKFM_AUTH_NO_RECOVER, ANY_PART),
1410442c956SVesa Jääskeläinen 	MECHANISM(PKCS11_CKM_SHA384_RSA_PKCS, CKFM_AUTH_NO_RECOVER, ANY_PART),
1420442c956SVesa Jääskeläinen 	MECHANISM(PKCS11_CKM_SHA512_RSA_PKCS, CKFM_AUTH_NO_RECOVER, ANY_PART),
143d9af50bcSVesa Jääskeläinen 	MECHANISM(PKCS11_CKM_SHA256_RSA_PKCS_PSS, CKFM_AUTH_NO_RECOVER,
144d9af50bcSVesa Jääskeläinen 		  ANY_PART),
145d9af50bcSVesa Jääskeläinen 	MECHANISM(PKCS11_CKM_SHA384_RSA_PKCS_PSS, CKFM_AUTH_NO_RECOVER,
146d9af50bcSVesa Jääskeläinen 		  ANY_PART),
147d9af50bcSVesa Jääskeläinen 	MECHANISM(PKCS11_CKM_SHA512_RSA_PKCS_PSS, CKFM_AUTH_NO_RECOVER,
148d9af50bcSVesa Jääskeläinen 		  ANY_PART),
1490442c956SVesa Jääskeläinen 	MECHANISM(PKCS11_CKM_SHA224_RSA_PKCS, CKFM_AUTH_NO_RECOVER, ANY_PART),
150d9af50bcSVesa Jääskeläinen 	MECHANISM(PKCS11_CKM_SHA224_RSA_PKCS_PSS, CKFM_AUTH_NO_RECOVER,
151d9af50bcSVesa Jääskeläinen 		  ANY_PART),
1528849c126SEtienne Carriere };
1538849c126SEtienne Carriere 
1548849c126SEtienne Carriere #if CFG_TEE_TA_LOG_LEVEL > 0
1558849c126SEtienne Carriere const char *mechanism_string_id(enum pkcs11_mechanism_id id)
1568849c126SEtienne Carriere {
1578849c126SEtienne Carriere 	const size_t offset = sizeof("PKCS11_CKM_") - 1;
1588849c126SEtienne Carriere 	size_t n = 0;
1598849c126SEtienne Carriere 
1608849c126SEtienne Carriere 	for (n = 0; n < ARRAY_SIZE(pkcs11_modes); n++)
1618849c126SEtienne Carriere 		if (pkcs11_modes[n].id == id)
1628849c126SEtienne Carriere 			return pkcs11_modes[n].string + offset;
1638849c126SEtienne Carriere 
1648849c126SEtienne Carriere 	return "Unknown ID";
1658849c126SEtienne Carriere }
1668849c126SEtienne Carriere #endif /*CFG_TEE_TA_LOG_LEVEL*/
1678849c126SEtienne Carriere 
1688849c126SEtienne Carriere /*
1698849c126SEtienne Carriere  * Return true if @id is a valid mechanism ID
1708849c126SEtienne Carriere  */
1718849c126SEtienne Carriere bool mechanism_is_valid(enum pkcs11_mechanism_id id)
1728849c126SEtienne Carriere {
1738849c126SEtienne Carriere 	size_t n = 0;
1748849c126SEtienne Carriere 
1758849c126SEtienne Carriere 	for (n = 0; n < ARRAY_SIZE(pkcs11_modes); n++)
1768849c126SEtienne Carriere 		if (id == pkcs11_modes[n].id)
1778849c126SEtienne Carriere 			return true;
1788849c126SEtienne Carriere 
1798849c126SEtienne Carriere 	return false;
1808849c126SEtienne Carriere }
1818849c126SEtienne Carriere 
1828849c126SEtienne Carriere /*
1838849c126SEtienne Carriere  * Return true if mechanism ID is valid and flags matches PKCS#11 compliancy
1848849c126SEtienne Carriere  */
1858849c126SEtienne Carriere bool __maybe_unused mechanism_flags_complies_pkcs11(uint32_t mechanism_type,
1868849c126SEtienne Carriere 						    uint32_t flags)
1878849c126SEtienne Carriere {
1888849c126SEtienne Carriere 	size_t n = 0;
1898849c126SEtienne Carriere 
1908849c126SEtienne Carriere 	assert((flags & ~ALLOWED_PKCS11_CKFM) == 0);
1918849c126SEtienne Carriere 
1928849c126SEtienne Carriere 	for (n = 0; n < ARRAY_SIZE(pkcs11_modes); n++) {
1938849c126SEtienne Carriere 		if (pkcs11_modes[n].id == mechanism_type) {
1948849c126SEtienne Carriere 			if (flags & ~pkcs11_modes[n].flags)
1958849c126SEtienne Carriere 				EMSG("%s flags: 0x%"PRIx32" vs 0x%"PRIx32,
1968849c126SEtienne Carriere 				     id2str_mechanism(mechanism_type),
1978849c126SEtienne Carriere 				     flags, pkcs11_modes[n].flags);
1988849c126SEtienne Carriere 
1998849c126SEtienne Carriere 			return (flags & ~pkcs11_modes[n].flags) == 0;
2008849c126SEtienne Carriere 		}
2018849c126SEtienne Carriere 	}
2028849c126SEtienne Carriere 
2038849c126SEtienne Carriere 	/* Mechanism ID unexpectedly not found */
2048849c126SEtienne Carriere 	return false;
2058849c126SEtienne Carriere }
2068849c126SEtienne Carriere 
207512cbf1dSJens Wiklander bool mechanism_is_one_shot_only(uint32_t mechanism_type)
208512cbf1dSJens Wiklander {
209512cbf1dSJens Wiklander 	size_t n = 0;
210512cbf1dSJens Wiklander 
211512cbf1dSJens Wiklander 	for (n = 0; n < ARRAY_SIZE(pkcs11_modes); n++)
212512cbf1dSJens Wiklander 		if (pkcs11_modes[n].id == mechanism_type)
213512cbf1dSJens Wiklander 			return pkcs11_modes[n].one_shot;
214512cbf1dSJens Wiklander 
215512cbf1dSJens Wiklander 	/* Mechanism ID unexpectedly not found */
216512cbf1dSJens Wiklander 	TEE_Panic(PKCS11_RV_NOT_FOUND);
217512cbf1dSJens Wiklander 	/* Dummy return to keep compiler happy */
218512cbf1dSJens Wiklander 	return false;
219512cbf1dSJens Wiklander }
220512cbf1dSJens Wiklander 
221512cbf1dSJens Wiklander /*
222512cbf1dSJens Wiklander  * Field single_part_only is unused from array token_mechanism[], hence
223512cbf1dSJens Wiklander  * simply use ANY_PART for all mechanism there.
224512cbf1dSJens Wiklander  */
225512cbf1dSJens Wiklander #define TA_MECHANISM(_label, _flags)	MECHANISM((_label), (_flags), ANY_PART)
226512cbf1dSJens Wiklander 
2278849c126SEtienne Carriere /*
2288849c126SEtienne Carriere  * Arrays that centralizes the IDs and processing flags for mechanisms
229c95980b1SEtienne Carriere  * supported by each embedded token.
2308849c126SEtienne Carriere  */
2318849c126SEtienne Carriere const struct pkcs11_mechachism_modes token_mechanism[] = {
2325f80f270SRuchika Gupta 	TA_MECHANISM(PKCS11_CKM_AES_ECB, CKFM_CIPHER_WRAP),
2335f80f270SRuchika Gupta 	TA_MECHANISM(PKCS11_CKM_AES_CBC, CKFM_CIPHER_WRAP),
234512cbf1dSJens Wiklander 	TA_MECHANISM(PKCS11_CKM_AES_CTR, CKFM_CIPHER),
235*63778faaSEtienne Carriere 	TA_MECHANISM(PKCS11_CKM_AES_GCM, CKFM_CIPHER),
236512cbf1dSJens Wiklander 	TA_MECHANISM(PKCS11_CKM_AES_CTS, CKFM_CIPHER),
2370ef6b144SVictor Chong 	TA_MECHANISM(PKCS11_CKM_AES_CMAC, CKFM_AUTH_NO_RECOVER),
2380ef6b144SVictor Chong 	TA_MECHANISM(PKCS11_CKM_AES_CMAC_GENERAL, CKFM_AUTH_NO_RECOVER),
239512cbf1dSJens Wiklander 	TA_MECHANISM(PKCS11_CKM_AES_ECB_ENCRYPT_DATA, PKCS11_CKFM_DERIVE),
240512cbf1dSJens Wiklander 	TA_MECHANISM(PKCS11_CKM_AES_CBC_ENCRYPT_DATA, PKCS11_CKFM_DERIVE),
241cc062b46SJorge Ramirez-Ortiz 	TA_MECHANISM(PKCS11_CKM_ECDH1_DERIVE, PKCS11_CKFM_DERIVE),
242fa247a2aSRuchika Gupta 	TA_MECHANISM(PKCS11_CKM_AES_KEY_GEN, PKCS11_CKFM_GENERATE),
243fa247a2aSRuchika Gupta 	TA_MECHANISM(PKCS11_CKM_GENERIC_SECRET_KEY_GEN, PKCS11_CKFM_GENERATE),
2449e91a619SVesa Jääskeläinen 	TA_MECHANISM(PKCS11_CKM_MD5, PKCS11_CKFM_DIGEST),
2459e91a619SVesa Jääskeläinen 	TA_MECHANISM(PKCS11_CKM_SHA_1, PKCS11_CKFM_DIGEST),
2469e91a619SVesa Jääskeläinen 	TA_MECHANISM(PKCS11_CKM_SHA224, PKCS11_CKFM_DIGEST),
2479e91a619SVesa Jääskeläinen 	TA_MECHANISM(PKCS11_CKM_SHA256, PKCS11_CKFM_DIGEST),
2489e91a619SVesa Jääskeläinen 	TA_MECHANISM(PKCS11_CKM_SHA384, PKCS11_CKFM_DIGEST),
2499e91a619SVesa Jääskeläinen 	TA_MECHANISM(PKCS11_CKM_SHA512, PKCS11_CKFM_DIGEST),
250689f4e5bSRuchika Gupta 	TA_MECHANISM(PKCS11_CKM_MD5_HMAC, CKFM_AUTH_NO_RECOVER),
251689f4e5bSRuchika Gupta 	TA_MECHANISM(PKCS11_CKM_SHA_1_HMAC, CKFM_AUTH_NO_RECOVER),
252689f4e5bSRuchika Gupta 	TA_MECHANISM(PKCS11_CKM_SHA224_HMAC, CKFM_AUTH_NO_RECOVER),
253689f4e5bSRuchika Gupta 	TA_MECHANISM(PKCS11_CKM_SHA256_HMAC, CKFM_AUTH_NO_RECOVER),
254689f4e5bSRuchika Gupta 	TA_MECHANISM(PKCS11_CKM_SHA384_HMAC, CKFM_AUTH_NO_RECOVER),
255689f4e5bSRuchika Gupta 	TA_MECHANISM(PKCS11_CKM_SHA512_HMAC, CKFM_AUTH_NO_RECOVER),
25670b6683bSVictor Chong 	TA_MECHANISM(PKCS11_CKM_MD5_HMAC_GENERAL, CKFM_AUTH_NO_RECOVER),
25770b6683bSVictor Chong 	TA_MECHANISM(PKCS11_CKM_SHA_1_HMAC_GENERAL, CKFM_AUTH_NO_RECOVER),
25870b6683bSVictor Chong 	TA_MECHANISM(PKCS11_CKM_SHA224_HMAC_GENERAL, CKFM_AUTH_NO_RECOVER),
25970b6683bSVictor Chong 	TA_MECHANISM(PKCS11_CKM_SHA256_HMAC_GENERAL, CKFM_AUTH_NO_RECOVER),
26070b6683bSVictor Chong 	TA_MECHANISM(PKCS11_CKM_SHA384_HMAC_GENERAL, CKFM_AUTH_NO_RECOVER),
26170b6683bSVictor Chong 	TA_MECHANISM(PKCS11_CKM_SHA512_HMAC_GENERAL, CKFM_AUTH_NO_RECOVER),
26202b16804SVesa Jääskeläinen 	TA_MECHANISM(PKCS11_CKM_EC_KEY_PAIR_GEN,
26302b16804SVesa Jääskeläinen 		     PKCS11_CKFM_GENERATE_KEY_PAIR),
26403e07432SValerii Chubar 	TA_MECHANISM(PKCS11_CKM_EC_EDWARDS_KEY_PAIR_GEN,
26503e07432SValerii Chubar 		     PKCS11_CKFM_GENERATE_KEY_PAIR),
266fb279d8bSVesa Jääskeläinen 	TA_MECHANISM(PKCS11_CKM_ECDSA, CKFM_AUTH_NO_RECOVER),
267fb279d8bSVesa Jääskeläinen 	TA_MECHANISM(PKCS11_CKM_ECDSA_SHA1, CKFM_AUTH_NO_RECOVER),
268fb279d8bSVesa Jääskeläinen 	TA_MECHANISM(PKCS11_CKM_ECDSA_SHA224, CKFM_AUTH_NO_RECOVER),
269fb279d8bSVesa Jääskeläinen 	TA_MECHANISM(PKCS11_CKM_ECDSA_SHA256, CKFM_AUTH_NO_RECOVER),
270fb279d8bSVesa Jääskeläinen 	TA_MECHANISM(PKCS11_CKM_ECDSA_SHA384, CKFM_AUTH_NO_RECOVER),
271fb279d8bSVesa Jääskeläinen 	TA_MECHANISM(PKCS11_CKM_ECDSA_SHA512, CKFM_AUTH_NO_RECOVER),
27203e07432SValerii Chubar 	TA_MECHANISM(PKCS11_CKM_EDDSA, CKFM_AUTH_NO_RECOVER),
27345d40bdaSValerii Chubar 	TA_MECHANISM(PKCS11_CKM_RSA_AES_KEY_WRAP, CKFM_CIPHER_WRAP),
27486922832SVesa Jääskeläinen 	TA_MECHANISM(PKCS11_CKM_RSA_PKCS_KEY_PAIR_GEN,
27586922832SVesa Jääskeläinen 		     PKCS11_CKFM_GENERATE_KEY_PAIR),
2760442c956SVesa Jääskeläinen 	TA_MECHANISM(PKCS11_CKM_RSA_PKCS, CKFM_CIPHER | CKFM_AUTH_NO_RECOVER),
277d9af50bcSVesa Jääskeläinen 	TA_MECHANISM(PKCS11_CKM_RSA_PKCS_PSS, CKFM_AUTH_NO_RECOVER),
2780442c956SVesa Jääskeläinen 	TA_MECHANISM(PKCS11_CKM_MD5_RSA_PKCS, CKFM_AUTH_NO_RECOVER),
2790442c956SVesa Jääskeläinen 	TA_MECHANISM(PKCS11_CKM_SHA1_RSA_PKCS, CKFM_AUTH_NO_RECOVER),
280dc8c77fcSVesa Jääskeläinen 	TA_MECHANISM(PKCS11_CKM_RSA_PKCS_OAEP, CKFM_CIPHER),
281d9af50bcSVesa Jääskeläinen 	TA_MECHANISM(PKCS11_CKM_SHA1_RSA_PKCS_PSS, CKFM_AUTH_NO_RECOVER),
2820442c956SVesa Jääskeläinen 	TA_MECHANISM(PKCS11_CKM_SHA256_RSA_PKCS, CKFM_AUTH_NO_RECOVER),
2830442c956SVesa Jääskeläinen 	TA_MECHANISM(PKCS11_CKM_SHA384_RSA_PKCS, CKFM_AUTH_NO_RECOVER),
2840442c956SVesa Jääskeläinen 	TA_MECHANISM(PKCS11_CKM_SHA512_RSA_PKCS, CKFM_AUTH_NO_RECOVER),
285d9af50bcSVesa Jääskeläinen 	TA_MECHANISM(PKCS11_CKM_SHA256_RSA_PKCS_PSS, CKFM_AUTH_NO_RECOVER),
286d9af50bcSVesa Jääskeläinen 	TA_MECHANISM(PKCS11_CKM_SHA384_RSA_PKCS_PSS, CKFM_AUTH_NO_RECOVER),
287d9af50bcSVesa Jääskeläinen 	TA_MECHANISM(PKCS11_CKM_SHA512_RSA_PKCS_PSS, CKFM_AUTH_NO_RECOVER),
2880442c956SVesa Jääskeläinen 	TA_MECHANISM(PKCS11_CKM_SHA224_RSA_PKCS, CKFM_AUTH_NO_RECOVER),
289d9af50bcSVesa Jääskeläinen 	TA_MECHANISM(PKCS11_CKM_SHA224_RSA_PKCS_PSS, CKFM_AUTH_NO_RECOVER),
2908849c126SEtienne Carriere };
2918849c126SEtienne Carriere 
2928849c126SEtienne Carriere /*
2938849c126SEtienne Carriere  * tee_malloc_mechanism_array - Allocate and fill array of supported mechanisms
2948849c126SEtienne Carriere  * @count: [in] [out] Pointer to number of mechanism IDs in client resource
2958849c126SEtienne Carriere  * Return allocated array of the supported mechanism IDs
2968849c126SEtienne Carriere  *
2978849c126SEtienne Carriere  * Allocates array with 32bit cells mechanism IDs for the supported ones only
2988849c126SEtienne Carriere  * if *@count covers number mechanism IDs exposed.
2998849c126SEtienne Carriere  */
3008849c126SEtienne Carriere uint32_t *tee_malloc_mechanism_list(size_t *out_count)
3018849c126SEtienne Carriere {
3028849c126SEtienne Carriere 	size_t n = 0;
3038849c126SEtienne Carriere 	size_t count = 0;
3048849c126SEtienne Carriere 	uint32_t *array = NULL;
3058849c126SEtienne Carriere 
3068849c126SEtienne Carriere 	for (n = 0; n < ARRAY_SIZE(token_mechanism); n++)
3078849c126SEtienne Carriere 		if (token_mechanism[n].flags)
3088849c126SEtienne Carriere 			count++;
3098849c126SEtienne Carriere 
3108849c126SEtienne Carriere 	if (*out_count >= count)
3118849c126SEtienne Carriere 		array = TEE_Malloc(count * sizeof(*array),
3128849c126SEtienne Carriere 				   TEE_USER_MEM_HINT_NO_FILL_ZERO);
3138849c126SEtienne Carriere 
3148849c126SEtienne Carriere 	*out_count = count;
3158849c126SEtienne Carriere 
3168849c126SEtienne Carriere 	if (!array)
3178849c126SEtienne Carriere 		return NULL;
3188849c126SEtienne Carriere 
3198849c126SEtienne Carriere 	for (n = 0; n < ARRAY_SIZE(token_mechanism); n++) {
3208849c126SEtienne Carriere 		if (token_mechanism[n].flags) {
3218849c126SEtienne Carriere 			count--;
3228849c126SEtienne Carriere 			array[count] = token_mechanism[n].id;
3238849c126SEtienne Carriere 		}
3248849c126SEtienne Carriere 	}
3258849c126SEtienne Carriere 	assert(!count);
3268849c126SEtienne Carriere 
3278849c126SEtienne Carriere 	return array;
3288849c126SEtienne Carriere }
3298849c126SEtienne Carriere 
3308849c126SEtienne Carriere uint32_t mechanism_supported_flags(enum pkcs11_mechanism_id id)
3318849c126SEtienne Carriere {
3328849c126SEtienne Carriere 	size_t n = 0;
3338849c126SEtienne Carriere 
3348849c126SEtienne Carriere 	for (n = 0; n < ARRAY_SIZE(token_mechanism); n++) {
3358849c126SEtienne Carriere 		if (id == token_mechanism[n].id) {
3368849c126SEtienne Carriere 			uint32_t flags = token_mechanism[n].flags;
3378849c126SEtienne Carriere 
3388849c126SEtienne Carriere 			assert(mechanism_flags_complies_pkcs11(id, flags));
3398849c126SEtienne Carriere 			return flags;
3408849c126SEtienne Carriere 		}
3418849c126SEtienne Carriere 	}
3428849c126SEtienne Carriere 
3438849c126SEtienne Carriere 	return 0;
3448849c126SEtienne Carriere }
345512cbf1dSJens Wiklander 
3462d0cd829SRuchika Gupta void pkcs11_mechanism_supported_key_sizes(uint32_t proc_id,
3472d0cd829SRuchika Gupta 					  uint32_t *min_key_size,
348512cbf1dSJens Wiklander 					  uint32_t *max_key_size)
349512cbf1dSJens Wiklander {
350512cbf1dSJens Wiklander 	switch (proc_id) {
351fa247a2aSRuchika Gupta 	case PKCS11_CKM_GENERIC_SECRET_KEY_GEN:
352fa247a2aSRuchika Gupta 		/* This mechanism expects the keysize to be returned in bits */
353fa247a2aSRuchika Gupta 		*min_key_size = 1;		/* in bits */
354fa247a2aSRuchika Gupta 		*max_key_size = 4096;		/* in bits */
355fa247a2aSRuchika Gupta 		break;
356689f4e5bSRuchika Gupta 	case PKCS11_CKM_MD5_HMAC:
35770b6683bSVictor Chong 	case PKCS11_CKM_MD5_HMAC_GENERAL:
358d92c3cddSRuchika Gupta 		*min_key_size = 8;
359d92c3cddSRuchika Gupta 		*max_key_size = 64;
360689f4e5bSRuchika Gupta 		break;
361689f4e5bSRuchika Gupta 	case PKCS11_CKM_SHA_1_HMAC:
36270b6683bSVictor Chong 	case PKCS11_CKM_SHA_1_HMAC_GENERAL:
363d92c3cddSRuchika Gupta 		*min_key_size = 10;
364d92c3cddSRuchika Gupta 		*max_key_size = 64;
365689f4e5bSRuchika Gupta 		break;
366689f4e5bSRuchika Gupta 	case PKCS11_CKM_SHA224_HMAC:
36770b6683bSVictor Chong 	case PKCS11_CKM_SHA224_HMAC_GENERAL:
368d92c3cddSRuchika Gupta 		*min_key_size = 14;
369d92c3cddSRuchika Gupta 		*max_key_size = 64;
370689f4e5bSRuchika Gupta 		break;
371689f4e5bSRuchika Gupta 	case PKCS11_CKM_SHA256_HMAC:
37270b6683bSVictor Chong 	case PKCS11_CKM_SHA256_HMAC_GENERAL:
373d92c3cddSRuchika Gupta 		*min_key_size = 24;
374d92c3cddSRuchika Gupta 		*max_key_size = 128;
375689f4e5bSRuchika Gupta 		break;
376689f4e5bSRuchika Gupta 	case PKCS11_CKM_SHA384_HMAC:
37770b6683bSVictor Chong 	case PKCS11_CKM_SHA384_HMAC_GENERAL:
378d92c3cddSRuchika Gupta 		*min_key_size = 32;
379d92c3cddSRuchika Gupta 		*max_key_size = 128;
380689f4e5bSRuchika Gupta 		break;
381689f4e5bSRuchika Gupta 	case PKCS11_CKM_SHA512_HMAC:
38270b6683bSVictor Chong 	case PKCS11_CKM_SHA512_HMAC_GENERAL:
383d92c3cddSRuchika Gupta 		*min_key_size = 32;
384d92c3cddSRuchika Gupta 		*max_key_size = 128;
385689f4e5bSRuchika Gupta 		break;
386512cbf1dSJens Wiklander 	case PKCS11_CKM_AES_KEY_GEN:
387512cbf1dSJens Wiklander 	case PKCS11_CKM_AES_ECB:
388512cbf1dSJens Wiklander 	case PKCS11_CKM_AES_CBC:
389512cbf1dSJens Wiklander 	case PKCS11_CKM_AES_CBC_PAD:
390512cbf1dSJens Wiklander 	case PKCS11_CKM_AES_CTR:
391*63778faaSEtienne Carriere 	case PKCS11_CKM_AES_GCM:
392512cbf1dSJens Wiklander 	case PKCS11_CKM_AES_CTS:
3930ef6b144SVictor Chong 	case PKCS11_CKM_AES_CMAC:
3940ef6b144SVictor Chong 	case PKCS11_CKM_AES_CMAC_GENERAL:
395512cbf1dSJens Wiklander 		*min_key_size = 16;
396512cbf1dSJens Wiklander 		*max_key_size = 32;
397512cbf1dSJens Wiklander 		break;
39802b16804SVesa Jääskeläinen 	case PKCS11_CKM_EC_KEY_PAIR_GEN:
399fb279d8bSVesa Jääskeläinen 	case PKCS11_CKM_ECDSA:
400fb279d8bSVesa Jääskeläinen 	case PKCS11_CKM_ECDSA_SHA1:
401fb279d8bSVesa Jääskeläinen 	case PKCS11_CKM_ECDSA_SHA224:
402fb279d8bSVesa Jääskeläinen 	case PKCS11_CKM_ECDSA_SHA256:
403fb279d8bSVesa Jääskeläinen 	case PKCS11_CKM_ECDSA_SHA384:
404fb279d8bSVesa Jääskeläinen 	case PKCS11_CKM_ECDSA_SHA512:
405cc062b46SJorge Ramirez-Ortiz 	case PKCS11_CKM_ECDH1_DERIVE:
40602b16804SVesa Jääskeläinen 		*min_key_size = 160;	/* in bits */
40702b16804SVesa Jääskeläinen 		*max_key_size = 521;	/* in bits */
40802b16804SVesa Jääskeläinen 		break;
40903e07432SValerii Chubar 	case PKCS11_CKM_EC_EDWARDS_KEY_PAIR_GEN:
41003e07432SValerii Chubar 	case PKCS11_CKM_EDDSA:
41103e07432SValerii Chubar 		*min_key_size = 256;	/* in bits */
41203e07432SValerii Chubar 		*max_key_size = 448;	/* in bits */
41303e07432SValerii Chubar 		break;
41486922832SVesa Jääskeläinen 	case PKCS11_CKM_RSA_PKCS_KEY_PAIR_GEN:
4150442c956SVesa Jääskeläinen 	case PKCS11_CKM_RSA_PKCS:
4160442c956SVesa Jääskeläinen 	case PKCS11_CKM_MD5_RSA_PKCS:
4170442c956SVesa Jääskeläinen 	case PKCS11_CKM_SHA1_RSA_PKCS:
418dc8c77fcSVesa Jääskeläinen 	case PKCS11_CKM_RSA_PKCS_OAEP:
419d9af50bcSVesa Jääskeläinen 	case PKCS11_CKM_SHA1_RSA_PKCS_PSS:
4200442c956SVesa Jääskeläinen 	case PKCS11_CKM_SHA256_RSA_PKCS:
4210442c956SVesa Jääskeläinen 	case PKCS11_CKM_SHA384_RSA_PKCS:
4220442c956SVesa Jääskeläinen 	case PKCS11_CKM_SHA512_RSA_PKCS:
423d9af50bcSVesa Jääskeläinen 	case PKCS11_CKM_SHA256_RSA_PKCS_PSS:
424d9af50bcSVesa Jääskeläinen 	case PKCS11_CKM_SHA384_RSA_PKCS_PSS:
425d9af50bcSVesa Jääskeläinen 	case PKCS11_CKM_SHA512_RSA_PKCS_PSS:
4260442c956SVesa Jääskeläinen 	case PKCS11_CKM_SHA224_RSA_PKCS:
427d9af50bcSVesa Jääskeläinen 	case PKCS11_CKM_SHA224_RSA_PKCS_PSS:
42886922832SVesa Jääskeläinen 		*min_key_size = 256;	/* in bits */
42986922832SVesa Jääskeläinen 		*max_key_size = 4096;	/* in bits */
43086922832SVesa Jääskeläinen 		break;
431512cbf1dSJens Wiklander 	default:
432512cbf1dSJens Wiklander 		*min_key_size = 0;
433512cbf1dSJens Wiklander 		*max_key_size = 0;
434512cbf1dSJens Wiklander 		break;
435512cbf1dSJens Wiklander 	}
436512cbf1dSJens Wiklander }
4372d0cd829SRuchika Gupta 
4382d0cd829SRuchika Gupta void mechanism_supported_key_sizes_bytes(uint32_t proc_id,
4392d0cd829SRuchika Gupta 					 uint32_t *min_key_size,
4402d0cd829SRuchika Gupta 					 uint32_t *max_key_size)
4412d0cd829SRuchika Gupta {
4422d0cd829SRuchika Gupta 	pkcs11_mechanism_supported_key_sizes(proc_id, min_key_size,
4432d0cd829SRuchika Gupta 					     max_key_size);
4442d0cd829SRuchika Gupta 
445db28c542SVesa Jääskeläinen 	switch (proc_id) {
446db28c542SVesa Jääskeläinen 	case PKCS11_CKM_GENERIC_SECRET_KEY_GEN:
44703e07432SValerii Chubar 	case PKCS11_CKM_EC_EDWARDS_KEY_PAIR_GEN:
448db28c542SVesa Jääskeläinen 	case PKCS11_CKM_EC_KEY_PAIR_GEN:
449db28c542SVesa Jääskeläinen 	case PKCS11_CKM_ECDSA:
45003e07432SValerii Chubar 	case PKCS11_CKM_EDDSA:
451db28c542SVesa Jääskeläinen 	case PKCS11_CKM_ECDSA_SHA1:
452db28c542SVesa Jääskeläinen 	case PKCS11_CKM_ECDSA_SHA224:
453db28c542SVesa Jääskeläinen 	case PKCS11_CKM_ECDSA_SHA256:
454db28c542SVesa Jääskeläinen 	case PKCS11_CKM_ECDSA_SHA384:
455db28c542SVesa Jääskeläinen 	case PKCS11_CKM_ECDSA_SHA512:
45686922832SVesa Jääskeläinen 	case PKCS11_CKM_RSA_PKCS_KEY_PAIR_GEN:
457db28c542SVesa Jääskeläinen 		/* Size is in bits -> convert to bytes and ceil */
458db28c542SVesa Jääskeläinen 		*min_key_size = ROUNDUP(*min_key_size, 8) / 8;
459db28c542SVesa Jääskeläinen 		*max_key_size = ROUNDUP(*max_key_size, 8) / 8;
460db28c542SVesa Jääskeläinen 		break;
461db28c542SVesa Jääskeläinen 	default:
462db28c542SVesa Jääskeläinen 		/* Size is already in bytes */
463db28c542SVesa Jääskeläinen 		break;
4642d0cd829SRuchika Gupta 	}
4652d0cd829SRuchika Gupta }
466