1fb7ef469SJerome Forissier // SPDX-License-Identifier: BSD-2-Clause 2b887bd8fSJens Wiklander /* 3b887bd8fSJens Wiklander * Copyright (c) 2017, Linaro Limited 4e43ab7a8SCedric Neveux * Copyright 2020 NXP 5eee637e7SAlexander Zakharov * Copyright 2021, SumUp Service GmbH 6b887bd8fSJens Wiklander */ 7b887bd8fSJens Wiklander 8d7ac7d0fSJens Wiklander #include <assert.h> 9b887bd8fSJens Wiklander #include <compiler.h> 10e1770e71SJens Wiklander #include <crypto/crypto.h> 116648f482SJens Wiklander #include <crypto/crypto_impl.h> 1233790cc1SJens Wiklander #include <kernel/panic.h> 13d7ac7d0fSJens Wiklander #include <stdlib.h> 14d7ac7d0fSJens Wiklander #include <string.h> 156d259e05SJens Wiklander #include <utee_defines.h> 16b887bd8fSJens Wiklander 176648f482SJens Wiklander TEE_Result crypto_hash_alloc_ctx(void **ctx, uint32_t algo) 18b887bd8fSJens Wiklander { 197222fc6aSCedric Neveux TEE_Result res = TEE_ERROR_NOT_IMPLEMENTED; 206648f482SJens Wiklander struct crypto_hash_ctx *c = NULL; 216648f482SJens Wiklander 227222fc6aSCedric Neveux /* 23e43ab7a8SCedric Neveux * Use default cryptographic implementation if no matching 247222fc6aSCedric Neveux * drvcrypt device. 257222fc6aSCedric Neveux */ 267222fc6aSCedric Neveux res = drvcrypt_hash_alloc_ctx(&c, algo); 277222fc6aSCedric Neveux 287222fc6aSCedric Neveux if (res == TEE_ERROR_NOT_IMPLEMENTED) { 296648f482SJens Wiklander switch (algo) { 306648f482SJens Wiklander case TEE_ALG_MD5: 316648f482SJens Wiklander res = crypto_md5_alloc_ctx(&c); 326648f482SJens Wiklander break; 336648f482SJens Wiklander case TEE_ALG_SHA1: 346648f482SJens Wiklander res = crypto_sha1_alloc_ctx(&c); 356648f482SJens Wiklander break; 366648f482SJens Wiklander case TEE_ALG_SHA224: 376648f482SJens Wiklander res = crypto_sha224_alloc_ctx(&c); 386648f482SJens Wiklander break; 396648f482SJens Wiklander case TEE_ALG_SHA256: 406648f482SJens Wiklander res = crypto_sha256_alloc_ctx(&c); 416648f482SJens Wiklander break; 426648f482SJens Wiklander case TEE_ALG_SHA384: 436648f482SJens Wiklander res = crypto_sha384_alloc_ctx(&c); 446648f482SJens Wiklander break; 456648f482SJens Wiklander case TEE_ALG_SHA512: 466648f482SJens Wiklander res = crypto_sha512_alloc_ctx(&c); 476648f482SJens Wiklander break; 48260b4028SJens Wiklander case TEE_ALG_SHA3_224: 49260b4028SJens Wiklander res = crypto_sha3_224_alloc_ctx(&c); 50260b4028SJens Wiklander break; 51260b4028SJens Wiklander case TEE_ALG_SHA3_256: 52260b4028SJens Wiklander res = crypto_sha3_256_alloc_ctx(&c); 53260b4028SJens Wiklander break; 54260b4028SJens Wiklander case TEE_ALG_SHA3_384: 55260b4028SJens Wiklander res = crypto_sha3_384_alloc_ctx(&c); 56260b4028SJens Wiklander break; 57260b4028SJens Wiklander case TEE_ALG_SHA3_512: 58260b4028SJens Wiklander res = crypto_sha3_512_alloc_ctx(&c); 59260b4028SJens Wiklander break; 60260b4028SJens Wiklander case TEE_ALG_SHAKE128: 61260b4028SJens Wiklander res = crypto_shake128_alloc_ctx(&c); 62260b4028SJens Wiklander break; 63260b4028SJens Wiklander case TEE_ALG_SHAKE256: 64260b4028SJens Wiklander res = crypto_shake256_alloc_ctx(&c); 65260b4028SJens Wiklander break; 6647645577SJerome Forissier case TEE_ALG_SM3: 6747645577SJerome Forissier res = crypto_sm3_alloc_ctx(&c); 6847645577SJerome Forissier break; 696648f482SJens Wiklander default: 707222fc6aSCedric Neveux break; 717222fc6aSCedric Neveux } 72b887bd8fSJens Wiklander } 73b887bd8fSJens Wiklander 746648f482SJens Wiklander if (!res) 756648f482SJens Wiklander *ctx = c; 766648f482SJens Wiklander 776648f482SJens Wiklander return res; 786648f482SJens Wiklander } 796648f482SJens Wiklander 806648f482SJens Wiklander static const struct crypto_hash_ops *hash_ops(void *ctx) 816648f482SJens Wiklander { 826648f482SJens Wiklander struct crypto_hash_ctx *c = ctx; 836648f482SJens Wiklander 846648f482SJens Wiklander assert(c && c->ops); 856648f482SJens Wiklander 866648f482SJens Wiklander return c->ops; 876648f482SJens Wiklander } 886648f482SJens Wiklander 896b3a371cSJens Wiklander void crypto_hash_free_ctx(void *ctx) 90ecf2e014SJens Wiklander { 91ce7a47f5SJerome Forissier if (ctx) 926648f482SJens Wiklander hash_ops(ctx)->free_ctx(ctx); 93ecf2e014SJens Wiklander } 94ecf2e014SJens Wiklander 956b3a371cSJens Wiklander void crypto_hash_copy_state(void *dst_ctx, void *src_ctx) 96ecf2e014SJens Wiklander { 976648f482SJens Wiklander hash_ops(dst_ctx)->copy_state(dst_ctx, src_ctx); 98ecf2e014SJens Wiklander } 99ecf2e014SJens Wiklander 1006b3a371cSJens Wiklander TEE_Result crypto_hash_init(void *ctx) 101b887bd8fSJens Wiklander { 1026648f482SJens Wiklander return hash_ops(ctx)->init(ctx); 103b887bd8fSJens Wiklander } 1046648f482SJens Wiklander 1056b3a371cSJens Wiklander TEE_Result crypto_hash_update(void *ctx, const uint8_t *data, size_t len) 106b887bd8fSJens Wiklander { 1076648f482SJens Wiklander return hash_ops(ctx)->update(ctx, data, len); 108b887bd8fSJens Wiklander } 1096648f482SJens Wiklander 1106b3a371cSJens Wiklander TEE_Result crypto_hash_final(void *ctx, uint8_t *digest, size_t len) 111b887bd8fSJens Wiklander { 1126648f482SJens Wiklander return hash_ops(ctx)->final(ctx, digest, len); 113b887bd8fSJens Wiklander } 11482d91db1SJens Wiklander 11596098f01SJens Wiklander TEE_Result crypto_cipher_alloc_ctx(void **ctx, uint32_t algo) 11682d91db1SJens Wiklander { 117e43ab7a8SCedric Neveux TEE_Result res = TEE_ERROR_NOT_IMPLEMENTED; 11896098f01SJens Wiklander struct crypto_cipher_ctx *c = NULL; 11996098f01SJens Wiklander 120e43ab7a8SCedric Neveux /* 121e43ab7a8SCedric Neveux * Use default cryptographic implementation if no matching 122e43ab7a8SCedric Neveux * drvcrypt device. 123e43ab7a8SCedric Neveux */ 124e43ab7a8SCedric Neveux res = drvcrypt_cipher_alloc_ctx(&c, algo); 125e43ab7a8SCedric Neveux 126e43ab7a8SCedric Neveux if (res == TEE_ERROR_NOT_IMPLEMENTED) { 12796098f01SJens Wiklander switch (algo) { 12896098f01SJens Wiklander case TEE_ALG_AES_ECB_NOPAD: 12996098f01SJens Wiklander res = crypto_aes_ecb_alloc_ctx(&c); 13096098f01SJens Wiklander break; 13196098f01SJens Wiklander case TEE_ALG_AES_CBC_NOPAD: 13296098f01SJens Wiklander res = crypto_aes_cbc_alloc_ctx(&c); 13396098f01SJens Wiklander break; 13496098f01SJens Wiklander case TEE_ALG_AES_CTR: 13596098f01SJens Wiklander res = crypto_aes_ctr_alloc_ctx(&c); 13696098f01SJens Wiklander break; 13796098f01SJens Wiklander case TEE_ALG_AES_CTS: 13896098f01SJens Wiklander res = crypto_aes_cts_alloc_ctx(&c); 13996098f01SJens Wiklander break; 14096098f01SJens Wiklander case TEE_ALG_AES_XTS: 14196098f01SJens Wiklander res = crypto_aes_xts_alloc_ctx(&c); 14296098f01SJens Wiklander break; 14396098f01SJens Wiklander case TEE_ALG_DES_ECB_NOPAD: 14496098f01SJens Wiklander res = crypto_des_ecb_alloc_ctx(&c); 14596098f01SJens Wiklander break; 14696098f01SJens Wiklander case TEE_ALG_DES3_ECB_NOPAD: 14796098f01SJens Wiklander res = crypto_des3_ecb_alloc_ctx(&c); 14896098f01SJens Wiklander break; 14996098f01SJens Wiklander case TEE_ALG_DES_CBC_NOPAD: 15096098f01SJens Wiklander res = crypto_des_cbc_alloc_ctx(&c); 15196098f01SJens Wiklander break; 15296098f01SJens Wiklander case TEE_ALG_DES3_CBC_NOPAD: 15396098f01SJens Wiklander res = crypto_des3_cbc_alloc_ctx(&c); 15496098f01SJens Wiklander break; 155ade6f848SJerome Forissier case TEE_ALG_SM4_ECB_NOPAD: 156ade6f848SJerome Forissier res = crypto_sm4_ecb_alloc_ctx(&c); 157ade6f848SJerome Forissier break; 158ade6f848SJerome Forissier case TEE_ALG_SM4_CBC_NOPAD: 159ade6f848SJerome Forissier res = crypto_sm4_cbc_alloc_ctx(&c); 160ade6f848SJerome Forissier break; 161ade6f848SJerome Forissier case TEE_ALG_SM4_CTR: 162ade6f848SJerome Forissier res = crypto_sm4_ctr_alloc_ctx(&c); 163ade6f848SJerome Forissier break; 164b21f583dSPingan Xie case TEE_ALG_SM4_XTS: 165b21f583dSPingan Xie res = crypto_sm4_xts_alloc_ctx(&c); 166b21f583dSPingan Xie break; 16796098f01SJens Wiklander default: 1681c5fdd1fSJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED; 16982d91db1SJens Wiklander } 170e43ab7a8SCedric Neveux } 17182d91db1SJens Wiklander 17296098f01SJens Wiklander if (!res) 17396098f01SJens Wiklander *ctx = c; 17496098f01SJens Wiklander 17596098f01SJens Wiklander return res; 17696098f01SJens Wiklander } 17796098f01SJens Wiklander 17896098f01SJens Wiklander static const struct crypto_cipher_ops *cipher_ops(void *ctx) 17996098f01SJens Wiklander { 18096098f01SJens Wiklander struct crypto_cipher_ctx *c = ctx; 18196098f01SJens Wiklander 18296098f01SJens Wiklander assert(c && c->ops); 18396098f01SJens Wiklander 18496098f01SJens Wiklander return c->ops; 18596098f01SJens Wiklander } 18696098f01SJens Wiklander 187cbda7091SJens Wiklander void crypto_cipher_free_ctx(void *ctx) 18872a9b1a0SJens Wiklander { 189ce7a47f5SJerome Forissier if (ctx) 19096098f01SJens Wiklander cipher_ops(ctx)->free_ctx(ctx); 19172a9b1a0SJens Wiklander } 19272a9b1a0SJens Wiklander 193cbda7091SJens Wiklander void crypto_cipher_copy_state(void *dst_ctx, void *src_ctx) 19472a9b1a0SJens Wiklander { 19596098f01SJens Wiklander cipher_ops(dst_ctx)->copy_state(dst_ctx, src_ctx); 19672a9b1a0SJens Wiklander } 19772a9b1a0SJens Wiklander 198cbda7091SJens Wiklander TEE_Result crypto_cipher_init(void *ctx, TEE_OperationMode mode, 199cbda7091SJens Wiklander const uint8_t *key1, size_t key1_len, 200cbda7091SJens Wiklander const uint8_t *key2, size_t key2_len, 201cbda7091SJens Wiklander const uint8_t *iv, size_t iv_len) 20282d91db1SJens Wiklander { 20396098f01SJens Wiklander if (mode != TEE_MODE_DECRYPT && mode != TEE_MODE_ENCRYPT) 20496098f01SJens Wiklander return TEE_ERROR_BAD_PARAMETERS; 20596098f01SJens Wiklander 20696098f01SJens Wiklander return cipher_ops(ctx)->init(ctx, mode, key1, key1_len, key2, key2_len, 20796098f01SJens Wiklander iv, iv_len); 20882d91db1SJens Wiklander } 20982d91db1SJens Wiklander 210cbda7091SJens Wiklander TEE_Result crypto_cipher_update(void *ctx, TEE_OperationMode mode __unused, 21196098f01SJens Wiklander bool last_block, const uint8_t *data, 21296098f01SJens Wiklander size_t len, uint8_t *dst) 21382d91db1SJens Wiklander { 21496098f01SJens Wiklander return cipher_ops(ctx)->update(ctx, last_block, data, len, dst); 21582d91db1SJens Wiklander } 21682d91db1SJens Wiklander 217cbda7091SJens Wiklander void crypto_cipher_final(void *ctx) 21882d91db1SJens Wiklander { 21996098f01SJens Wiklander cipher_ops(ctx)->final(ctx); 22082d91db1SJens Wiklander } 221e9eaba5cSJens Wiklander 2226d259e05SJens Wiklander TEE_Result crypto_cipher_get_block_size(uint32_t algo, size_t *size) 2236d259e05SJens Wiklander { 2246d259e05SJens Wiklander uint32_t class = TEE_ALG_GET_CLASS(algo); 2256d259e05SJens Wiklander 2266d259e05SJens Wiklander if (class != TEE_OPERATION_CIPHER && class != TEE_OPERATION_MAC && 2276d259e05SJens Wiklander class != TEE_OPERATION_AE) 2286d259e05SJens Wiklander return TEE_ERROR_BAD_PARAMETERS; 2296d259e05SJens Wiklander 2306d259e05SJens Wiklander switch (TEE_ALG_GET_MAIN_ALG(algo)) { 2316d259e05SJens Wiklander case TEE_MAIN_ALGO_AES: 2326d259e05SJens Wiklander *size = TEE_AES_BLOCK_SIZE; 2336d259e05SJens Wiklander return TEE_SUCCESS; 2346d259e05SJens Wiklander case TEE_MAIN_ALGO_DES: 2356d259e05SJens Wiklander case TEE_MAIN_ALGO_DES3: 2366d259e05SJens Wiklander *size = TEE_DES_BLOCK_SIZE; 2376d259e05SJens Wiklander return TEE_SUCCESS; 238ade6f848SJerome Forissier case TEE_MAIN_ALGO_SM4: 239ade6f848SJerome Forissier *size = TEE_SM4_BLOCK_SIZE; 240ade6f848SJerome Forissier return TEE_SUCCESS; 2416d259e05SJens Wiklander default: 2426d259e05SJens Wiklander return TEE_ERROR_NOT_SUPPORTED; 2436d259e05SJens Wiklander } 2446d259e05SJens Wiklander } 2456d259e05SJens Wiklander 2465da36a24SJens Wiklander TEE_Result crypto_mac_alloc_ctx(void **ctx, uint32_t algo) 247e9eaba5cSJens Wiklander { 2485da36a24SJens Wiklander TEE_Result res = TEE_SUCCESS; 2495da36a24SJens Wiklander struct crypto_mac_ctx *c = NULL; 2505da36a24SJens Wiklander 251ea9ac29cSCedric Neveux /* 252ea9ac29cSCedric Neveux * Use default cryptographic implementation if no matching 253ea9ac29cSCedric Neveux * drvcrypt device. 254ea9ac29cSCedric Neveux */ 255ea9ac29cSCedric Neveux res = drvcrypt_mac_alloc_ctx(&c, algo); 256ea9ac29cSCedric Neveux 257ea9ac29cSCedric Neveux if (res == TEE_ERROR_NOT_IMPLEMENTED) { 2585da36a24SJens Wiklander switch (algo) { 2595da36a24SJens Wiklander case TEE_ALG_HMAC_MD5: 2605da36a24SJens Wiklander res = crypto_hmac_md5_alloc_ctx(&c); 2615da36a24SJens Wiklander break; 2625da36a24SJens Wiklander case TEE_ALG_HMAC_SHA1: 2635da36a24SJens Wiklander res = crypto_hmac_sha1_alloc_ctx(&c); 2645da36a24SJens Wiklander break; 2655da36a24SJens Wiklander case TEE_ALG_HMAC_SHA224: 2665da36a24SJens Wiklander res = crypto_hmac_sha224_alloc_ctx(&c); 2675da36a24SJens Wiklander break; 2685da36a24SJens Wiklander case TEE_ALG_HMAC_SHA256: 2695da36a24SJens Wiklander res = crypto_hmac_sha256_alloc_ctx(&c); 2705da36a24SJens Wiklander break; 2715da36a24SJens Wiklander case TEE_ALG_HMAC_SHA384: 2725da36a24SJens Wiklander res = crypto_hmac_sha384_alloc_ctx(&c); 2735da36a24SJens Wiklander break; 2745da36a24SJens Wiklander case TEE_ALG_HMAC_SHA512: 2755da36a24SJens Wiklander res = crypto_hmac_sha512_alloc_ctx(&c); 2765da36a24SJens Wiklander break; 277260b4028SJens Wiklander case TEE_ALG_HMAC_SHA3_224: 278260b4028SJens Wiklander res = crypto_hmac_sha3_224_alloc_ctx(&c); 279260b4028SJens Wiklander break; 280260b4028SJens Wiklander case TEE_ALG_HMAC_SHA3_256: 281260b4028SJens Wiklander res = crypto_hmac_sha3_256_alloc_ctx(&c); 282260b4028SJens Wiklander break; 283260b4028SJens Wiklander case TEE_ALG_HMAC_SHA3_384: 284260b4028SJens Wiklander res = crypto_hmac_sha3_384_alloc_ctx(&c); 285260b4028SJens Wiklander break; 286260b4028SJens Wiklander case TEE_ALG_HMAC_SHA3_512: 287260b4028SJens Wiklander res = crypto_hmac_sha3_512_alloc_ctx(&c); 288260b4028SJens Wiklander break; 28947645577SJerome Forissier case TEE_ALG_HMAC_SM3: 29047645577SJerome Forissier res = crypto_hmac_sm3_alloc_ctx(&c); 29147645577SJerome Forissier break; 2925da36a24SJens Wiklander case TEE_ALG_AES_CBC_MAC_NOPAD: 2935da36a24SJens Wiklander res = crypto_aes_cbc_mac_nopad_alloc_ctx(&c); 2945da36a24SJens Wiklander break; 2955da36a24SJens Wiklander case TEE_ALG_AES_CBC_MAC_PKCS5: 2965da36a24SJens Wiklander res = crypto_aes_cbc_mac_pkcs5_alloc_ctx(&c); 2975da36a24SJens Wiklander break; 2985da36a24SJens Wiklander case TEE_ALG_DES_CBC_MAC_NOPAD: 2995da36a24SJens Wiklander res = crypto_des_cbc_mac_nopad_alloc_ctx(&c); 3005da36a24SJens Wiklander break; 3015da36a24SJens Wiklander case TEE_ALG_DES_CBC_MAC_PKCS5: 3025da36a24SJens Wiklander res = crypto_des_cbc_mac_pkcs5_alloc_ctx(&c); 3035da36a24SJens Wiklander break; 3045da36a24SJens Wiklander case TEE_ALG_DES3_CBC_MAC_NOPAD: 3055da36a24SJens Wiklander res = crypto_des3_cbc_mac_nopad_alloc_ctx(&c); 3065da36a24SJens Wiklander break; 3075da36a24SJens Wiklander case TEE_ALG_DES3_CBC_MAC_PKCS5: 3085da36a24SJens Wiklander res = crypto_des3_cbc_mac_pkcs5_alloc_ctx(&c); 3095da36a24SJens Wiklander break; 310eee637e7SAlexander Zakharov case TEE_ALG_DES3_CMAC: 311eee637e7SAlexander Zakharov res = crypto_des3_cmac_alloc_ctx(&c); 312eee637e7SAlexander Zakharov break; 3135da36a24SJens Wiklander case TEE_ALG_AES_CMAC: 3145da36a24SJens Wiklander res = crypto_aes_cmac_alloc_ctx(&c); 3155da36a24SJens Wiklander break; 3165da36a24SJens Wiklander default: 3175da36a24SJens Wiklander return TEE_ERROR_NOT_SUPPORTED; 3185da36a24SJens Wiklander } 319ea9ac29cSCedric Neveux } 3205da36a24SJens Wiklander 3215da36a24SJens Wiklander if (!res) 3225da36a24SJens Wiklander *ctx = c; 3235da36a24SJens Wiklander 3245da36a24SJens Wiklander return res; 3255da36a24SJens Wiklander } 3265da36a24SJens Wiklander 3275da36a24SJens Wiklander static const struct crypto_mac_ops *mac_ops(void *ctx) 3285da36a24SJens Wiklander { 3295da36a24SJens Wiklander struct crypto_mac_ctx *c = ctx; 3305da36a24SJens Wiklander 3315da36a24SJens Wiklander assert(c && c->ops); 3325da36a24SJens Wiklander 3335da36a24SJens Wiklander return c->ops; 334e9eaba5cSJens Wiklander } 335e9eaba5cSJens Wiklander 336c69bc615SJens Wiklander void crypto_mac_free_ctx(void *ctx) 33782ef73bcSJens Wiklander { 338ce7a47f5SJerome Forissier if (ctx) 3395da36a24SJens Wiklander mac_ops(ctx)->free_ctx(ctx); 34082ef73bcSJens Wiklander } 34182ef73bcSJens Wiklander 342c69bc615SJens Wiklander void crypto_mac_copy_state(void *dst_ctx, void *src_ctx) 34382ef73bcSJens Wiklander { 3445da36a24SJens Wiklander mac_ops(dst_ctx)->copy_state(dst_ctx, src_ctx); 34582ef73bcSJens Wiklander } 34682ef73bcSJens Wiklander 347c69bc615SJens Wiklander TEE_Result crypto_mac_init(void *ctx, const uint8_t *key, size_t len) 348e9eaba5cSJens Wiklander { 3495da36a24SJens Wiklander return mac_ops(ctx)->init(ctx, key, len); 350e9eaba5cSJens Wiklander } 351e9eaba5cSJens Wiklander 352c69bc615SJens Wiklander TEE_Result crypto_mac_update(void *ctx, const uint8_t *data, size_t len) 353e9eaba5cSJens Wiklander { 3545da36a24SJens Wiklander if (!len) 3555da36a24SJens Wiklander return TEE_SUCCESS; 3565da36a24SJens Wiklander 3575da36a24SJens Wiklander return mac_ops(ctx)->update(ctx, data, len); 358e9eaba5cSJens Wiklander } 359e9eaba5cSJens Wiklander 360c69bc615SJens Wiklander TEE_Result crypto_mac_final(void *ctx, uint8_t *digest, size_t digest_len) 361e9eaba5cSJens Wiklander { 3625da36a24SJens Wiklander return mac_ops(ctx)->final(ctx, digest, digest_len); 363e9eaba5cSJens Wiklander } 364e9eaba5cSJens Wiklander 365d7ac7d0fSJens Wiklander TEE_Result crypto_authenc_alloc_ctx(void **ctx, uint32_t algo) 3668875ce46SJens Wiklander { 367e3e4ce47SNicolas Toromanoff TEE_Result res = TEE_ERROR_NOT_IMPLEMENTED; 368f1e9b21bSJens Wiklander struct crypto_authenc_ctx *c = NULL; 369f1e9b21bSJens Wiklander 370e3e4ce47SNicolas Toromanoff /* 371e3e4ce47SNicolas Toromanoff * Use default authenc implementation if no matching 372e3e4ce47SNicolas Toromanoff * drvcrypt device. 373e3e4ce47SNicolas Toromanoff */ 374e3e4ce47SNicolas Toromanoff res = drvcrypt_authenc_alloc_ctx(&c, algo); 375e3e4ce47SNicolas Toromanoff 376e3e4ce47SNicolas Toromanoff if (res == TEE_ERROR_NOT_IMPLEMENTED) { 377d0620b01SJens Wiklander switch (algo) { 378d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM) 379d0620b01SJens Wiklander case TEE_ALG_AES_CCM: 380f1e9b21bSJens Wiklander res = crypto_aes_ccm_alloc_ctx(&c); 381f1e9b21bSJens Wiklander break; 382d0620b01SJens Wiklander #endif 383d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM) 384d0620b01SJens Wiklander case TEE_ALG_AES_GCM: 385f1e9b21bSJens Wiklander res = crypto_aes_gcm_alloc_ctx(&c); 386f1e9b21bSJens Wiklander break; 387d0620b01SJens Wiklander #endif 388d0620b01SJens Wiklander default: 389e3e4ce47SNicolas Toromanoff break; 390e3e4ce47SNicolas Toromanoff } 3918875ce46SJens Wiklander } 392f1e9b21bSJens Wiklander 393f1e9b21bSJens Wiklander if (!res) 394f1e9b21bSJens Wiklander *ctx = c; 395f1e9b21bSJens Wiklander 396f1e9b21bSJens Wiklander return res; 397d0620b01SJens Wiklander } 3988875ce46SJens Wiklander 399f1e9b21bSJens Wiklander static const struct crypto_authenc_ops *ae_ops(void *ctx) 400d7ac7d0fSJens Wiklander { 401f1e9b21bSJens Wiklander struct crypto_authenc_ctx *c = ctx; 402f1e9b21bSJens Wiklander 403f1e9b21bSJens Wiklander assert(c && c->ops); 404f1e9b21bSJens Wiklander 405f1e9b21bSJens Wiklander return c->ops; 406d7ac7d0fSJens Wiklander } 407d7ac7d0fSJens Wiklander 40852ee414bSJens Wiklander TEE_Result crypto_authenc_init(void *ctx, TEE_OperationMode mode, 409f1e9b21bSJens Wiklander const uint8_t *key, size_t key_len, 410f1e9b21bSJens Wiklander const uint8_t *nonce, size_t nonce_len, 411f1e9b21bSJens Wiklander size_t tag_len, size_t aad_len, 412f1e9b21bSJens Wiklander size_t payload_len) 413d7ac7d0fSJens Wiklander { 414f1e9b21bSJens Wiklander return ae_ops(ctx)->init(ctx, mode, key, key_len, nonce, nonce_len, 415f1e9b21bSJens Wiklander tag_len, aad_len, payload_len); 416d7ac7d0fSJens Wiklander } 417d7ac7d0fSJens Wiklander 41852ee414bSJens Wiklander TEE_Result crypto_authenc_update_aad(void *ctx, TEE_OperationMode mode __unused, 419f1e9b21bSJens Wiklander const uint8_t *data, size_t len) 4208875ce46SJens Wiklander { 421f1e9b21bSJens Wiklander return ae_ops(ctx)->update_aad(ctx, data, len); 422d0620b01SJens Wiklander } 4238875ce46SJens Wiklander 424d0620b01SJens Wiklander 42552ee414bSJens Wiklander TEE_Result crypto_authenc_update_payload(void *ctx, TEE_OperationMode mode, 426f1e9b21bSJens Wiklander const uint8_t *src_data, 427f1e9b21bSJens Wiklander size_t src_len, uint8_t *dst_data, 428f1e9b21bSJens Wiklander size_t *dst_len) 429f1e9b21bSJens Wiklander { 430f1e9b21bSJens Wiklander if (*dst_len < src_len) 431d0620b01SJens Wiklander return TEE_ERROR_SHORT_BUFFER; 432d0620b01SJens Wiklander *dst_len = src_len; 433d0620b01SJens Wiklander 434f1e9b21bSJens Wiklander return ae_ops(ctx)->update_payload(ctx, mode, src_data, src_len, 435f1e9b21bSJens Wiklander dst_data); 436d0620b01SJens Wiklander } 4378875ce46SJens Wiklander 43852ee414bSJens Wiklander TEE_Result crypto_authenc_enc_final(void *ctx, const uint8_t *src_data, 43952ee414bSJens Wiklander size_t src_len, uint8_t *dst_data, 44052ee414bSJens Wiklander size_t *dst_len, uint8_t *dst_tag, 44152ee414bSJens Wiklander size_t *dst_tag_len) 4428875ce46SJens Wiklander { 443f1e9b21bSJens Wiklander if (*dst_len < src_len) 444f1e9b21bSJens Wiklander return TEE_ERROR_SHORT_BUFFER; 445d0620b01SJens Wiklander *dst_len = src_len; 446d0620b01SJens Wiklander 447f1e9b21bSJens Wiklander return ae_ops(ctx)->enc_final(ctx, src_data, src_len, dst_data, 448f1e9b21bSJens Wiklander dst_tag, dst_tag_len); 4498875ce46SJens Wiklander } 4508875ce46SJens Wiklander 45152ee414bSJens Wiklander TEE_Result crypto_authenc_dec_final(void *ctx, const uint8_t *src_data, 45252ee414bSJens Wiklander size_t src_len, uint8_t *dst_data, 45352ee414bSJens Wiklander size_t *dst_len, const uint8_t *tag, 45452ee414bSJens Wiklander size_t tag_len) 4558875ce46SJens Wiklander { 456f1e9b21bSJens Wiklander if (*dst_len < src_len) 457f1e9b21bSJens Wiklander return TEE_ERROR_SHORT_BUFFER; 458f1e9b21bSJens Wiklander *dst_len = src_len; 459f1e9b21bSJens Wiklander 460f1e9b21bSJens Wiklander return ae_ops(ctx)->dec_final(ctx, src_data, src_len, dst_data, tag, 461f1e9b21bSJens Wiklander tag_len); 4628875ce46SJens Wiklander } 463f1e9b21bSJens Wiklander 46452ee414bSJens Wiklander void crypto_authenc_final(void *ctx) 465f1e9b21bSJens Wiklander { 466f1e9b21bSJens Wiklander ae_ops(ctx)->final(ctx); 467f1e9b21bSJens Wiklander } 468f1e9b21bSJens Wiklander 46952ee414bSJens Wiklander void crypto_authenc_free_ctx(void *ctx) 470f1e9b21bSJens Wiklander { 471f1e9b21bSJens Wiklander if (ctx) 472f1e9b21bSJens Wiklander ae_ops(ctx)->free_ctx(ctx); 473f1e9b21bSJens Wiklander } 474f1e9b21bSJens Wiklander 47552ee414bSJens Wiklander void crypto_authenc_copy_state(void *dst_ctx, void *src_ctx) 476f1e9b21bSJens Wiklander { 477f1e9b21bSJens Wiklander ae_ops(dst_ctx)->copy_state(dst_ctx, src_ctx); 478d0620b01SJens Wiklander } 47933790cc1SJens Wiklander 480da1de557SJens Wiklander #if !defined(CFG_CRYPTO_RSA) && !defined(CFG_CRYPTO_DSA) && \ 481da1de557SJens Wiklander !defined(CFG_CRYPTO_DH) && !defined(CFG_CRYPTO_ECC) 48233790cc1SJens Wiklander struct bignum *crypto_bignum_allocate(size_t size_bits __unused) 48333790cc1SJens Wiklander { 48433790cc1SJens Wiklander return NULL; 48533790cc1SJens Wiklander } 48633790cc1SJens Wiklander 48733790cc1SJens Wiklander TEE_Result crypto_bignum_bin2bn(const uint8_t *from __unused, 48833790cc1SJens Wiklander size_t fromsize __unused, 48933790cc1SJens Wiklander struct bignum *to __unused) 49033790cc1SJens Wiklander { 49133790cc1SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 49233790cc1SJens Wiklander } 49333790cc1SJens Wiklander 49433790cc1SJens Wiklander size_t crypto_bignum_num_bytes(struct bignum *a __unused) 49533790cc1SJens Wiklander { 49633790cc1SJens Wiklander return 0; 49733790cc1SJens Wiklander } 49833790cc1SJens Wiklander 49933790cc1SJens Wiklander size_t crypto_bignum_num_bits(struct bignum *a __unused) 50033790cc1SJens Wiklander { 50133790cc1SJens Wiklander return 0; 50233790cc1SJens Wiklander } 50333790cc1SJens Wiklander 50433790cc1SJens Wiklander /* 50533790cc1SJens Wiklander * crypto_bignum_allocate() and crypto_bignum_bin2bn() failing should be 50633790cc1SJens Wiklander * enough to guarantee that the functions calling this function aren't 50733790cc1SJens Wiklander * called, but just in case add a panic() here to avoid unexpected 50833790cc1SJens Wiklander * behavoir. 50933790cc1SJens Wiklander */ 51033790cc1SJens Wiklander static void bignum_cant_happen(void) 51133790cc1SJens Wiklander { 51233790cc1SJens Wiklander volatile bool b = true; 51333790cc1SJens Wiklander 51433790cc1SJens Wiklander /* Avoid warning about function does not return */ 51533790cc1SJens Wiklander if (b) 51633790cc1SJens Wiklander panic(); 51733790cc1SJens Wiklander } 51833790cc1SJens Wiklander 51933790cc1SJens Wiklander void crypto_bignum_bn2bin(const struct bignum *from __unused, 52033790cc1SJens Wiklander uint8_t *to __unused) 52133790cc1SJens Wiklander { 52233790cc1SJens Wiklander bignum_cant_happen(); 52333790cc1SJens Wiklander } 52433790cc1SJens Wiklander 52533790cc1SJens Wiklander void crypto_bignum_copy(struct bignum *to __unused, 52633790cc1SJens Wiklander const struct bignum *from __unused) 52733790cc1SJens Wiklander { 52833790cc1SJens Wiklander bignum_cant_happen(); 52933790cc1SJens Wiklander } 53033790cc1SJens Wiklander 531e2ec831cSJihwan Park void crypto_bignum_free(struct bignum **a) 53233790cc1SJens Wiklander { 533e2ec831cSJihwan Park if (a && *a) 53433790cc1SJens Wiklander panic(); 53533790cc1SJens Wiklander } 53633790cc1SJens Wiklander 53733790cc1SJens Wiklander void crypto_bignum_clear(struct bignum *a __unused) 53833790cc1SJens Wiklander { 53933790cc1SJens Wiklander bignum_cant_happen(); 54033790cc1SJens Wiklander } 54133790cc1SJens Wiklander 54233790cc1SJens Wiklander /* return -1 if a<b, 0 if a==b, +1 if a>b */ 54333790cc1SJens Wiklander int32_t crypto_bignum_compare(struct bignum *a __unused, 54433790cc1SJens Wiklander struct bignum *b __unused) 54533790cc1SJens Wiklander { 54633790cc1SJens Wiklander bignum_cant_happen(); 54733790cc1SJens Wiklander return -1; 54833790cc1SJens Wiklander } 549da1de557SJens Wiklander #endif 550291e5450SJens Wiklander 551da1de557SJens Wiklander #if !defined(CFG_CRYPTO_RSA) 552291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_rsa_keypair(struct rsa_keypair *s __unused, 553291e5450SJens Wiklander size_t key_size_bits __unused) 554291e5450SJens Wiklander { 555291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 556291e5450SJens Wiklander } 557291e5450SJens Wiklander 558291e5450SJens Wiklander TEE_Result 559291e5450SJens Wiklander crypto_acipher_alloc_rsa_public_key(struct rsa_public_key *s __unused, 560291e5450SJens Wiklander size_t key_size_bits __unused) 561291e5450SJens Wiklander { 562291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 563291e5450SJens Wiklander } 564291e5450SJens Wiklander 565291e5450SJens Wiklander void crypto_acipher_free_rsa_public_key(struct rsa_public_key *s __unused) 566291e5450SJens Wiklander { 567291e5450SJens Wiklander } 568291e5450SJens Wiklander 569a1d5c81fSElias von Däniken void crypto_acipher_free_rsa_keypair(struct rsa_keypair *s __unused) 570a1d5c81fSElias von Däniken { 571a1d5c81fSElias von Däniken } 572a1d5c81fSElias von Däniken 573291e5450SJens Wiklander TEE_Result crypto_acipher_gen_rsa_key(struct rsa_keypair *key __unused, 574291e5450SJens Wiklander size_t key_size __unused) 575291e5450SJens Wiklander { 576291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 577291e5450SJens Wiklander } 578291e5450SJens Wiklander 579291e5450SJens Wiklander TEE_Result crypto_acipher_rsanopad_decrypt(struct rsa_keypair *key __unused, 580291e5450SJens Wiklander const uint8_t *src __unused, 581291e5450SJens Wiklander size_t src_len __unused, 582291e5450SJens Wiklander uint8_t *dst __unused, 583291e5450SJens Wiklander size_t *dst_len __unused) 584291e5450SJens Wiklander { 585291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 586291e5450SJens Wiklander } 587291e5450SJens Wiklander 588291e5450SJens Wiklander TEE_Result crypto_acipher_rsanopad_encrypt(struct rsa_public_key *key __unused, 589291e5450SJens Wiklander const uint8_t *src __unused, 590291e5450SJens Wiklander size_t src_len __unused, 591291e5450SJens Wiklander uint8_t *dst __unused, 592291e5450SJens Wiklander size_t *dst_len __unused) 593291e5450SJens Wiklander { 594291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 595291e5450SJens Wiklander } 596291e5450SJens Wiklander 597291e5450SJens Wiklander TEE_Result crypto_acipher_rsaes_decrypt(uint32_t algo __unused, 598291e5450SJens Wiklander struct rsa_keypair *key __unused, 599291e5450SJens Wiklander const uint8_t *label __unused, 600291e5450SJens Wiklander size_t label_len __unused, 601291e5450SJens Wiklander const uint8_t *src __unused, 602291e5450SJens Wiklander size_t src_len __unused, 603291e5450SJens Wiklander uint8_t *dst __unused, 604291e5450SJens Wiklander size_t *dst_len __unused) 605291e5450SJens Wiklander { 606291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 607291e5450SJens Wiklander } 608291e5450SJens Wiklander 609291e5450SJens Wiklander TEE_Result crypto_acipher_rsaes_encrypt(uint32_t algo __unused, 610291e5450SJens Wiklander struct rsa_public_key *key __unused, 611291e5450SJens Wiklander const uint8_t *label __unused, 612291e5450SJens Wiklander size_t label_len __unused, 613291e5450SJens Wiklander const uint8_t *src __unused, 614291e5450SJens Wiklander size_t src_len __unused, 615291e5450SJens Wiklander uint8_t *dst __unused, 616291e5450SJens Wiklander size_t *dst_len __unused) 617291e5450SJens Wiklander { 618291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 619291e5450SJens Wiklander } 620291e5450SJens Wiklander 621291e5450SJens Wiklander TEE_Result crypto_acipher_rsassa_sign(uint32_t algo __unused, 622291e5450SJens Wiklander struct rsa_keypair *key __unused, 623291e5450SJens Wiklander int salt_len __unused, 624291e5450SJens Wiklander const uint8_t *msg __unused, 625291e5450SJens Wiklander size_t msg_len __unused, 626291e5450SJens Wiklander uint8_t *sig __unused, 627291e5450SJens Wiklander size_t *sig_len __unused) 628291e5450SJens Wiklander { 629291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 630291e5450SJens Wiklander } 631291e5450SJens Wiklander 632291e5450SJens Wiklander TEE_Result crypto_acipher_rsassa_verify(uint32_t algo __unused, 633291e5450SJens Wiklander struct rsa_public_key *key __unused, 634291e5450SJens Wiklander int salt_len __unused, 635291e5450SJens Wiklander const uint8_t *msg __unused, 636291e5450SJens Wiklander size_t msg_len __unused, 637291e5450SJens Wiklander const uint8_t *sig __unused, 638291e5450SJens Wiklander size_t sig_len __unused) 639291e5450SJens Wiklander { 640291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 641291e5450SJens Wiklander } 642da1de557SJens Wiklander #endif /*!CFG_CRYPTO_RSA*/ 643291e5450SJens Wiklander 644da1de557SJens Wiklander #if !defined(CFG_CRYPTO_DSA) 645291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_dsa_keypair(struct dsa_keypair *s __unused, 646291e5450SJens Wiklander size_t key_size_bits __unused) 647291e5450SJens Wiklander { 648291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 649291e5450SJens Wiklander } 650291e5450SJens Wiklander 651291e5450SJens Wiklander TEE_Result 652291e5450SJens Wiklander crypto_acipher_alloc_dsa_public_key(struct dsa_public_key *s __unused, 653291e5450SJens Wiklander size_t key_size_bits __unused) 654291e5450SJens Wiklander { 655291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 656291e5450SJens Wiklander } 657291e5450SJens Wiklander 658291e5450SJens Wiklander TEE_Result crypto_acipher_gen_dsa_key(struct dsa_keypair *key __unused, 659291e5450SJens Wiklander size_t key_size __unused) 660291e5450SJens Wiklander { 661291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 662291e5450SJens Wiklander } 663291e5450SJens Wiklander 664291e5450SJens Wiklander TEE_Result crypto_acipher_dsa_sign(uint32_t algo __unused, 665291e5450SJens Wiklander struct dsa_keypair *key __unused, 666291e5450SJens Wiklander const uint8_t *msg __unused, 667291e5450SJens Wiklander size_t msg_len __unused, 668291e5450SJens Wiklander uint8_t *sig __unused, 669291e5450SJens Wiklander size_t *sig_len __unused) 670291e5450SJens Wiklander { 671291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 672291e5450SJens Wiklander } 673291e5450SJens Wiklander 674291e5450SJens Wiklander TEE_Result crypto_acipher_dsa_verify(uint32_t algo __unused, 675291e5450SJens Wiklander struct dsa_public_key *key __unused, 676291e5450SJens Wiklander const uint8_t *msg __unused, 677291e5450SJens Wiklander size_t msg_len __unused, 678291e5450SJens Wiklander const uint8_t *sig __unused, 679291e5450SJens Wiklander size_t sig_len __unused) 680291e5450SJens Wiklander { 681291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 682291e5450SJens Wiklander } 683da1de557SJens Wiklander #endif /*!CFG_CRYPTO_DSA*/ 684291e5450SJens Wiklander 685da1de557SJens Wiklander #if !defined(CFG_CRYPTO_DH) 686291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_dh_keypair(struct dh_keypair *s __unused, 687291e5450SJens Wiklander size_t key_size_bits __unused) 688291e5450SJens Wiklander { 689291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 690291e5450SJens Wiklander } 691291e5450SJens Wiklander 692291e5450SJens Wiklander TEE_Result crypto_acipher_gen_dh_key(struct dh_keypair *key __unused, 693291e5450SJens Wiklander struct bignum *q __unused, 6949f4dcefbSJerome Forissier size_t xbits __unused, 6959f4dcefbSJerome Forissier size_t key_size __unused) 696291e5450SJens Wiklander { 697291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 698291e5450SJens Wiklander } 699291e5450SJens Wiklander 700291e5450SJens Wiklander TEE_Result 701291e5450SJens Wiklander crypto_acipher_dh_shared_secret(struct dh_keypair *private_key __unused, 702291e5450SJens Wiklander struct bignum *public_key __unused, 703291e5450SJens Wiklander struct bignum *secret __unused) 704291e5450SJens Wiklander { 705291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 706291e5450SJens Wiklander } 707da1de557SJens Wiklander #endif /*!CFG_CRYPTO_DH*/ 708291e5450SJens Wiklander 709df00cf59SCedric Neveux TEE_Result crypto_acipher_alloc_ecc_public_key(struct ecc_public_key *key, 710df00cf59SCedric Neveux uint32_t key_type, 711df00cf59SCedric Neveux size_t key_size_bits) 712291e5450SJens Wiklander { 713df00cf59SCedric Neveux TEE_Result res = TEE_ERROR_NOT_IMPLEMENTED; 714df00cf59SCedric Neveux 715df00cf59SCedric Neveux /* 716df00cf59SCedric Neveux * Use default cryptographic implementation if no matching 717df00cf59SCedric Neveux * drvcrypt device. 718df00cf59SCedric Neveux */ 719df00cf59SCedric Neveux res = drvcrypt_asym_alloc_ecc_public_key(key, key_type, key_size_bits); 720df00cf59SCedric Neveux if (res == TEE_ERROR_NOT_IMPLEMENTED) 721df00cf59SCedric Neveux res = crypto_asym_alloc_ecc_public_key(key, key_type, 722df00cf59SCedric Neveux key_size_bits); 723df00cf59SCedric Neveux 724df00cf59SCedric Neveux return res; 725291e5450SJens Wiklander } 726291e5450SJens Wiklander 727df00cf59SCedric Neveux TEE_Result crypto_acipher_alloc_ecc_keypair(struct ecc_keypair *key, 728df00cf59SCedric Neveux uint32_t key_type, 729df00cf59SCedric Neveux size_t key_size_bits) 730291e5450SJens Wiklander { 731df00cf59SCedric Neveux TEE_Result res = TEE_ERROR_NOT_IMPLEMENTED; 732df00cf59SCedric Neveux 733df00cf59SCedric Neveux /* 734df00cf59SCedric Neveux * Use default cryptographic implementation if no matching 735df00cf59SCedric Neveux * drvcrypt device. 736df00cf59SCedric Neveux */ 737df00cf59SCedric Neveux res = drvcrypt_asym_alloc_ecc_keypair(key, key_type, key_size_bits); 738df00cf59SCedric Neveux if (res == TEE_ERROR_NOT_IMPLEMENTED) 739df00cf59SCedric Neveux res = crypto_asym_alloc_ecc_keypair(key, key_type, 740df00cf59SCedric Neveux key_size_bits); 741df00cf59SCedric Neveux 742df00cf59SCedric Neveux return res; 743291e5450SJens Wiklander } 744291e5450SJens Wiklander 745df00cf59SCedric Neveux void crypto_acipher_free_ecc_public_key(struct ecc_public_key *key) 746291e5450SJens Wiklander { 747df00cf59SCedric Neveux assert(key->ops && key->ops->free); 748df00cf59SCedric Neveux 749df00cf59SCedric Neveux key->ops->free(key); 750291e5450SJens Wiklander } 751291e5450SJens Wiklander 752df00cf59SCedric Neveux TEE_Result crypto_acipher_gen_ecc_key(struct ecc_keypair *key, 753df00cf59SCedric Neveux size_t key_size_bits) 754291e5450SJens Wiklander { 755df00cf59SCedric Neveux assert(key->ops && key->ops->generate); 756df00cf59SCedric Neveux 757df00cf59SCedric Neveux return key->ops->generate(key, key_size_bits); 758291e5450SJens Wiklander } 759291e5450SJens Wiklander 760df00cf59SCedric Neveux TEE_Result crypto_acipher_ecc_sign(uint32_t algo, struct ecc_keypair *key, 761df00cf59SCedric Neveux const uint8_t *msg, size_t msg_len, 762df00cf59SCedric Neveux uint8_t *sig, size_t *sig_len) 763291e5450SJens Wiklander { 764df00cf59SCedric Neveux assert(key->ops); 765df00cf59SCedric Neveux 766df00cf59SCedric Neveux if (!key->ops->sign) 767291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 768df00cf59SCedric Neveux 769df00cf59SCedric Neveux return key->ops->sign(algo, key, msg, msg_len, sig, sig_len); 770291e5450SJens Wiklander } 771291e5450SJens Wiklander 772df00cf59SCedric Neveux TEE_Result crypto_acipher_ecc_verify(uint32_t algo, struct ecc_public_key *key, 773df00cf59SCedric Neveux const uint8_t *msg, size_t msg_len, 774df00cf59SCedric Neveux const uint8_t *sig, size_t sig_len) 775291e5450SJens Wiklander { 776df00cf59SCedric Neveux assert(key->ops); 777df00cf59SCedric Neveux 778df00cf59SCedric Neveux if (!key->ops->verify) 779291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 780df00cf59SCedric Neveux 781df00cf59SCedric Neveux return key->ops->verify(algo, key, msg, msg_len, sig, sig_len); 782291e5450SJens Wiklander } 783291e5450SJens Wiklander 784df00cf59SCedric Neveux TEE_Result crypto_acipher_ecc_shared_secret(struct ecc_keypair *private_key, 785df00cf59SCedric Neveux struct ecc_public_key *public_key, 786df00cf59SCedric Neveux void *secret, 787df00cf59SCedric Neveux unsigned long *secret_len) 788291e5450SJens Wiklander { 789df00cf59SCedric Neveux assert(private_key->ops); 790df00cf59SCedric Neveux 791df00cf59SCedric Neveux if (!private_key->ops->shared_secret) 792291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 793df00cf59SCedric Neveux 794df00cf59SCedric Neveux return private_key->ops->shared_secret(private_key, public_key, secret, 795df00cf59SCedric Neveux secret_len); 796291e5450SJens Wiklander } 79791fc6bd8SJerome Forissier 798884fd190SCedric Neveux TEE_Result crypto_acipher_sm2_pke_decrypt(struct ecc_keypair *key, 799884fd190SCedric Neveux const uint8_t *src, size_t src_len, 800884fd190SCedric Neveux uint8_t *dst, size_t *dst_len) 80191fc6bd8SJerome Forissier { 802884fd190SCedric Neveux assert(key->ops); 803884fd190SCedric Neveux 804884fd190SCedric Neveux if (!key->ops->decrypt) 80591fc6bd8SJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED; 806884fd190SCedric Neveux 807884fd190SCedric Neveux return key->ops->decrypt(key, src, src_len, dst, dst_len); 80891fc6bd8SJerome Forissier } 80991fc6bd8SJerome Forissier 810884fd190SCedric Neveux TEE_Result crypto_acipher_sm2_pke_encrypt(struct ecc_public_key *key, 811884fd190SCedric Neveux const uint8_t *src, size_t src_len, 812884fd190SCedric Neveux uint8_t *dst, size_t *dst_len) 81391fc6bd8SJerome Forissier { 814884fd190SCedric Neveux assert(key->ops); 815884fd190SCedric Neveux 816884fd190SCedric Neveux if (!key->ops->encrypt) 81791fc6bd8SJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED; 818884fd190SCedric Neveux 819884fd190SCedric Neveux return key->ops->encrypt(key, src, src_len, dst, dst_len); 82091fc6bd8SJerome Forissier } 8210f151943SJerome Forissier 8225b385b3fSJerome Forissier #if !defined(CFG_CRYPTO_SM2_KEP) 8235b385b3fSJerome Forissier TEE_Result crypto_acipher_sm2_kep_derive(struct ecc_keypair *my_key __unused, 8245b385b3fSJerome Forissier struct ecc_keypair *my_eph_key 8255b385b3fSJerome Forissier __unused, 8265b385b3fSJerome Forissier struct ecc_public_key *peer_key 8275b385b3fSJerome Forissier __unused, 8285b385b3fSJerome Forissier struct ecc_public_key *peer_eph_key 8295b385b3fSJerome Forissier __unused, 8305b385b3fSJerome Forissier struct sm2_kep_parms *p __unused) 8315b385b3fSJerome Forissier { 8325b385b3fSJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED; 8335b385b3fSJerome Forissier } 8345b385b3fSJerome Forissier #endif 8355dfe86d0SJorge Ramirez-Ortiz 83690040fa4SSohaib ul Hassan #if !defined(CFG_CRYPTO_X25519) 83746e25a17Sloubaihui TEE_Result crypto_acipher_alloc_x25519_keypair(struct montgomery_keypair *key 83890040fa4SSohaib ul Hassan __unused, 83990040fa4SSohaib ul Hassan size_t key_size_bits __unused) 84090040fa4SSohaib ul Hassan { 84190040fa4SSohaib ul Hassan return TEE_ERROR_NOT_IMPLEMENTED; 84290040fa4SSohaib ul Hassan } 84390040fa4SSohaib ul Hassan 84446e25a17Sloubaihui TEE_Result crypto_acipher_gen_x25519_key(struct montgomery_keypair 84546e25a17Sloubaihui *key __unused, 84690040fa4SSohaib ul Hassan size_t key_size __unused) 84790040fa4SSohaib ul Hassan { 84890040fa4SSohaib ul Hassan return TEE_ERROR_NOT_IMPLEMENTED; 84990040fa4SSohaib ul Hassan } 85090040fa4SSohaib ul Hassan 85146e25a17Sloubaihui TEE_Result crypto_acipher_x25519_shared_secret(struct montgomery_keypair 85290040fa4SSohaib ul Hassan *private_key __unused, 85390040fa4SSohaib ul Hassan void *public_key __unused, 85490040fa4SSohaib ul Hassan void *secret __unused, 85590040fa4SSohaib ul Hassan unsigned long 85690040fa4SSohaib ul Hassan *secret_len __unused) 85790040fa4SSohaib ul Hassan { 85890040fa4SSohaib ul Hassan return TEE_ERROR_NOT_IMPLEMENTED; 85990040fa4SSohaib ul Hassan } 86090040fa4SSohaib ul Hassan #endif 86190040fa4SSohaib ul Hassan 862*34ce35b1Sloubaihui #if !defined(CFG_CRYPTO_X448) 863*34ce35b1Sloubaihui TEE_Result crypto_acipher_alloc_x448_keypair(struct montgomery_keypair *key 864*34ce35b1Sloubaihui __unused, 865*34ce35b1Sloubaihui size_t key_size_bits __unused) 866*34ce35b1Sloubaihui { 867*34ce35b1Sloubaihui return TEE_ERROR_NOT_IMPLEMENTED; 868*34ce35b1Sloubaihui } 869*34ce35b1Sloubaihui 870*34ce35b1Sloubaihui TEE_Result crypto_acipher_gen_x448_key(struct montgomery_keypair *key __unused, 871*34ce35b1Sloubaihui size_t key_size __unused) 872*34ce35b1Sloubaihui { 873*34ce35b1Sloubaihui return TEE_ERROR_NOT_IMPLEMENTED; 874*34ce35b1Sloubaihui } 875*34ce35b1Sloubaihui 876*34ce35b1Sloubaihui TEE_Result crypto_acipher_x448_shared_secret(struct montgomery_keypair 877*34ce35b1Sloubaihui *private_key __unused, 878*34ce35b1Sloubaihui void *public_key __unused, 879*34ce35b1Sloubaihui void *secret __unused, 880*34ce35b1Sloubaihui unsigned long 881*34ce35b1Sloubaihui *secret_len __unused) 882*34ce35b1Sloubaihui { 883*34ce35b1Sloubaihui return TEE_ERROR_NOT_IMPLEMENTED; 884*34ce35b1Sloubaihui } 885*34ce35b1Sloubaihui #endif 886*34ce35b1Sloubaihui 887a116848bSValerii Chubar #if !defined(CFG_CRYPTO_ED25519) 888a116848bSValerii Chubar TEE_Result crypto_acipher_alloc_ed25519_keypair(struct ed25519_keypair *key 889a116848bSValerii Chubar __unused, 890a116848bSValerii Chubar size_t key_size_bits __unused) 891a116848bSValerii Chubar { 892a116848bSValerii Chubar return TEE_ERROR_NOT_IMPLEMENTED; 893a116848bSValerii Chubar } 894a116848bSValerii Chubar 895c4cab13eSClement Faure TEE_Result 896c4cab13eSClement Faure crypto_acipher_alloc_ed25519_public_key(struct ed25519_public_key *key __unused, 897c4cab13eSClement Faure size_t key_size __unused) 898c4cab13eSClement Faure { 899c4cab13eSClement Faure return TEE_ERROR_NOT_IMPLEMENTED; 900c4cab13eSClement Faure } 901c4cab13eSClement Faure 902a116848bSValerii Chubar TEE_Result crypto_acipher_gen_ed25519_key(struct ed25519_keypair *key __unused, 903a116848bSValerii Chubar size_t key_size __unused) 904a116848bSValerii Chubar { 905a116848bSValerii Chubar return TEE_ERROR_NOT_IMPLEMENTED; 906a116848bSValerii Chubar } 907a116848bSValerii Chubar 908a116848bSValerii Chubar TEE_Result crypto_acipher_ed25519_sign(struct ed25519_keypair *key __unused, 909a116848bSValerii Chubar const uint8_t *msg __unused, 910a116848bSValerii Chubar size_t msg_len __unused, 911a116848bSValerii Chubar uint8_t *sig __unused, 912a116848bSValerii Chubar size_t *sig_len __unused) 913a116848bSValerii Chubar { 914a116848bSValerii Chubar return TEE_ERROR_NOT_IMPLEMENTED; 915a116848bSValerii Chubar } 916a116848bSValerii Chubar 917c4cab13eSClement Faure TEE_Result 918c4cab13eSClement Faure crypto_acipher_ed25519_verify(struct ed25519_public_key *key __unused, 919a116848bSValerii Chubar const uint8_t *msg __unused, 920a116848bSValerii Chubar size_t msg_len __unused, 921a116848bSValerii Chubar const uint8_t *sig __unused, 922a116848bSValerii Chubar size_t sig_len __unused) 923a116848bSValerii Chubar { 924a116848bSValerii Chubar return TEE_ERROR_NOT_IMPLEMENTED; 925a116848bSValerii Chubar } 926a116848bSValerii Chubar 927a116848bSValerii Chubar TEE_Result crypto_acipher_ed25519ctx_sign(struct ed25519_keypair *key __unused, 928a116848bSValerii Chubar const uint8_t *msg __unused, 929a116848bSValerii Chubar size_t msg_len __unused, 930a116848bSValerii Chubar uint8_t *sig __unused, 931a116848bSValerii Chubar size_t *sig_len __unused, 932a116848bSValerii Chubar bool ph_flag __unused, 933a116848bSValerii Chubar const uint8_t *ctx __unused, 934a116848bSValerii Chubar size_t ctxlen __unused) 935a116848bSValerii Chubar { 936a116848bSValerii Chubar return TEE_ERROR_NOT_IMPLEMENTED; 937a116848bSValerii Chubar } 938a116848bSValerii Chubar 939c4cab13eSClement Faure TEE_Result 940c4cab13eSClement Faure crypto_acipher_ed25519ctx_verify(struct ed25519_public_key *key __unused, 941a116848bSValerii Chubar const uint8_t *msg __unused, 942a116848bSValerii Chubar size_t msg_len __unused, 943a116848bSValerii Chubar const uint8_t *sig __unused, 944a116848bSValerii Chubar size_t sig_len __unused, 945a116848bSValerii Chubar bool ph_flag __unused, 946a116848bSValerii Chubar const uint8_t *ctx __unused, 947a116848bSValerii Chubar size_t ctxlen __unused) 948a116848bSValerii Chubar { 949a116848bSValerii Chubar return TEE_ERROR_NOT_IMPLEMENTED; 950a116848bSValerii Chubar } 951a116848bSValerii Chubar #endif 952a116848bSValerii Chubar 9536301ca1cSJorge Ramirez-Ortiz __weak TEE_Result crypto_storage_obj_del(struct tee_obj *obj __unused) 9545dfe86d0SJorge Ramirez-Ortiz { 9556301ca1cSJorge Ramirez-Ortiz return TEE_ERROR_NOT_IMPLEMENTED; 9565dfe86d0SJorge Ramirez-Ortiz } 957