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), 135*e02f17f3SAlexandre Marechal MECHANISM(PKCS11_CKM_RSA_X_509, CKFM_CIPHER_WRAP | 136*e02f17f3SAlexandre Marechal CKFM_AUTH_NO_RECOVER | CKFM_AUTH_WITH_RECOVER, 137*e02f17f3SAlexandre 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 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 */ 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 */ 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 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), 280*e02f17f3SAlexandre Marechal #ifdef CFG_PKCS11_TA_RSA_X_509 281*e02f17f3SAlexandre Marechal TA_MECHANISM(PKCS11_CKM_RSA_X_509, CKFM_AUTH_NO_RECOVER), 282*e02f17f3SAlexandre 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 */ 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 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 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: 422*e02f17f3SAlexandre 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 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 */ 465db28c542SVesa Jääskeläinen *min_key_size = ROUNDUP(*min_key_size, 8) / 8; 466db28c542SVesa Jääskeläinen *max_key_size = ROUNDUP(*max_key_size, 8) / 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