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; 4847645577SJerome Forissier case TEE_ALG_SM3: 4947645577SJerome Forissier res = crypto_sm3_alloc_ctx(&c); 5047645577SJerome Forissier break; 516648f482SJens Wiklander default: 527222fc6aSCedric Neveux break; 537222fc6aSCedric Neveux } 54b887bd8fSJens Wiklander } 55b887bd8fSJens Wiklander 566648f482SJens Wiklander if (!res) 576648f482SJens Wiklander *ctx = c; 586648f482SJens Wiklander 596648f482SJens Wiklander return res; 606648f482SJens Wiklander } 616648f482SJens Wiklander 626648f482SJens Wiklander static const struct crypto_hash_ops *hash_ops(void *ctx) 636648f482SJens Wiklander { 646648f482SJens Wiklander struct crypto_hash_ctx *c = ctx; 656648f482SJens Wiklander 666648f482SJens Wiklander assert(c && c->ops); 676648f482SJens Wiklander 686648f482SJens Wiklander return c->ops; 696648f482SJens Wiklander } 706648f482SJens Wiklander 716b3a371cSJens Wiklander void crypto_hash_free_ctx(void *ctx) 72ecf2e014SJens Wiklander { 73ce7a47f5SJerome Forissier if (ctx) 746648f482SJens Wiklander hash_ops(ctx)->free_ctx(ctx); 75ecf2e014SJens Wiklander } 76ecf2e014SJens Wiklander 776b3a371cSJens Wiklander void crypto_hash_copy_state(void *dst_ctx, void *src_ctx) 78ecf2e014SJens Wiklander { 796648f482SJens Wiklander hash_ops(dst_ctx)->copy_state(dst_ctx, src_ctx); 80ecf2e014SJens Wiklander } 81ecf2e014SJens Wiklander 826b3a371cSJens Wiklander TEE_Result crypto_hash_init(void *ctx) 83b887bd8fSJens Wiklander { 846648f482SJens Wiklander return hash_ops(ctx)->init(ctx); 85b887bd8fSJens Wiklander } 866648f482SJens Wiklander 876b3a371cSJens Wiklander TEE_Result crypto_hash_update(void *ctx, const uint8_t *data, size_t len) 88b887bd8fSJens Wiklander { 896648f482SJens Wiklander return hash_ops(ctx)->update(ctx, data, len); 90b887bd8fSJens Wiklander } 916648f482SJens Wiklander 926b3a371cSJens Wiklander TEE_Result crypto_hash_final(void *ctx, uint8_t *digest, size_t len) 93b887bd8fSJens Wiklander { 946648f482SJens Wiklander return hash_ops(ctx)->final(ctx, digest, len); 95b887bd8fSJens Wiklander } 9682d91db1SJens Wiklander 9796098f01SJens Wiklander TEE_Result crypto_cipher_alloc_ctx(void **ctx, uint32_t algo) 9882d91db1SJens Wiklander { 99e43ab7a8SCedric Neveux TEE_Result res = TEE_ERROR_NOT_IMPLEMENTED; 10096098f01SJens Wiklander struct crypto_cipher_ctx *c = NULL; 10196098f01SJens Wiklander 102e43ab7a8SCedric Neveux /* 103e43ab7a8SCedric Neveux * Use default cryptographic implementation if no matching 104e43ab7a8SCedric Neveux * drvcrypt device. 105e43ab7a8SCedric Neveux */ 106e43ab7a8SCedric Neveux res = drvcrypt_cipher_alloc_ctx(&c, algo); 107e43ab7a8SCedric Neveux 108e43ab7a8SCedric Neveux if (res == TEE_ERROR_NOT_IMPLEMENTED) { 10996098f01SJens Wiklander switch (algo) { 11096098f01SJens Wiklander case TEE_ALG_AES_ECB_NOPAD: 11196098f01SJens Wiklander res = crypto_aes_ecb_alloc_ctx(&c); 11296098f01SJens Wiklander break; 11396098f01SJens Wiklander case TEE_ALG_AES_CBC_NOPAD: 11496098f01SJens Wiklander res = crypto_aes_cbc_alloc_ctx(&c); 11596098f01SJens Wiklander break; 11696098f01SJens Wiklander case TEE_ALG_AES_CTR: 11796098f01SJens Wiklander res = crypto_aes_ctr_alloc_ctx(&c); 11896098f01SJens Wiklander break; 11996098f01SJens Wiklander case TEE_ALG_AES_CTS: 12096098f01SJens Wiklander res = crypto_aes_cts_alloc_ctx(&c); 12196098f01SJens Wiklander break; 12296098f01SJens Wiklander case TEE_ALG_AES_XTS: 12396098f01SJens Wiklander res = crypto_aes_xts_alloc_ctx(&c); 12496098f01SJens Wiklander break; 12596098f01SJens Wiklander case TEE_ALG_DES_ECB_NOPAD: 12696098f01SJens Wiklander res = crypto_des_ecb_alloc_ctx(&c); 12796098f01SJens Wiklander break; 12896098f01SJens Wiklander case TEE_ALG_DES3_ECB_NOPAD: 12996098f01SJens Wiklander res = crypto_des3_ecb_alloc_ctx(&c); 13096098f01SJens Wiklander break; 13196098f01SJens Wiklander case TEE_ALG_DES_CBC_NOPAD: 13296098f01SJens Wiklander res = crypto_des_cbc_alloc_ctx(&c); 13396098f01SJens Wiklander break; 13496098f01SJens Wiklander case TEE_ALG_DES3_CBC_NOPAD: 13596098f01SJens Wiklander res = crypto_des3_cbc_alloc_ctx(&c); 13696098f01SJens Wiklander break; 137ade6f848SJerome Forissier case TEE_ALG_SM4_ECB_NOPAD: 138ade6f848SJerome Forissier res = crypto_sm4_ecb_alloc_ctx(&c); 139ade6f848SJerome Forissier break; 140ade6f848SJerome Forissier case TEE_ALG_SM4_CBC_NOPAD: 141ade6f848SJerome Forissier res = crypto_sm4_cbc_alloc_ctx(&c); 142ade6f848SJerome Forissier break; 143ade6f848SJerome Forissier case TEE_ALG_SM4_CTR: 144ade6f848SJerome Forissier res = crypto_sm4_ctr_alloc_ctx(&c); 145ade6f848SJerome Forissier break; 14696098f01SJens Wiklander default: 1471c5fdd1fSJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED; 14882d91db1SJens Wiklander } 149e43ab7a8SCedric Neveux } 15082d91db1SJens Wiklander 15196098f01SJens Wiklander if (!res) 15296098f01SJens Wiklander *ctx = c; 15396098f01SJens Wiklander 15496098f01SJens Wiklander return res; 15596098f01SJens Wiklander } 15696098f01SJens Wiklander 15796098f01SJens Wiklander static const struct crypto_cipher_ops *cipher_ops(void *ctx) 15896098f01SJens Wiklander { 15996098f01SJens Wiklander struct crypto_cipher_ctx *c = ctx; 16096098f01SJens Wiklander 16196098f01SJens Wiklander assert(c && c->ops); 16296098f01SJens Wiklander 16396098f01SJens Wiklander return c->ops; 16496098f01SJens Wiklander } 16596098f01SJens Wiklander 166cbda7091SJens Wiklander void crypto_cipher_free_ctx(void *ctx) 16772a9b1a0SJens Wiklander { 168ce7a47f5SJerome Forissier if (ctx) 16996098f01SJens Wiklander cipher_ops(ctx)->free_ctx(ctx); 17072a9b1a0SJens Wiklander } 17172a9b1a0SJens Wiklander 172cbda7091SJens Wiklander void crypto_cipher_copy_state(void *dst_ctx, void *src_ctx) 17372a9b1a0SJens Wiklander { 17496098f01SJens Wiklander cipher_ops(dst_ctx)->copy_state(dst_ctx, src_ctx); 17572a9b1a0SJens Wiklander } 17672a9b1a0SJens Wiklander 177cbda7091SJens Wiklander TEE_Result crypto_cipher_init(void *ctx, TEE_OperationMode mode, 178cbda7091SJens Wiklander const uint8_t *key1, size_t key1_len, 179cbda7091SJens Wiklander const uint8_t *key2, size_t key2_len, 180cbda7091SJens Wiklander const uint8_t *iv, size_t iv_len) 18182d91db1SJens Wiklander { 18296098f01SJens Wiklander if (mode != TEE_MODE_DECRYPT && mode != TEE_MODE_ENCRYPT) 18396098f01SJens Wiklander return TEE_ERROR_BAD_PARAMETERS; 18496098f01SJens Wiklander 18596098f01SJens Wiklander return cipher_ops(ctx)->init(ctx, mode, key1, key1_len, key2, key2_len, 18696098f01SJens Wiklander iv, iv_len); 18782d91db1SJens Wiklander } 18882d91db1SJens Wiklander 189cbda7091SJens Wiklander TEE_Result crypto_cipher_update(void *ctx, TEE_OperationMode mode __unused, 19096098f01SJens Wiklander bool last_block, const uint8_t *data, 19196098f01SJens Wiklander size_t len, uint8_t *dst) 19282d91db1SJens Wiklander { 19396098f01SJens Wiklander return cipher_ops(ctx)->update(ctx, last_block, data, len, dst); 19482d91db1SJens Wiklander } 19582d91db1SJens Wiklander 196cbda7091SJens Wiklander void crypto_cipher_final(void *ctx) 19782d91db1SJens Wiklander { 19896098f01SJens Wiklander cipher_ops(ctx)->final(ctx); 19982d91db1SJens Wiklander } 200e9eaba5cSJens Wiklander 2016d259e05SJens Wiklander TEE_Result crypto_cipher_get_block_size(uint32_t algo, size_t *size) 2026d259e05SJens Wiklander { 2036d259e05SJens Wiklander uint32_t class = TEE_ALG_GET_CLASS(algo); 2046d259e05SJens Wiklander 2056d259e05SJens Wiklander if (class != TEE_OPERATION_CIPHER && class != TEE_OPERATION_MAC && 2066d259e05SJens Wiklander class != TEE_OPERATION_AE) 2076d259e05SJens Wiklander return TEE_ERROR_BAD_PARAMETERS; 2086d259e05SJens Wiklander 2096d259e05SJens Wiklander switch (TEE_ALG_GET_MAIN_ALG(algo)) { 2106d259e05SJens Wiklander case TEE_MAIN_ALGO_AES: 2116d259e05SJens Wiklander *size = TEE_AES_BLOCK_SIZE; 2126d259e05SJens Wiklander return TEE_SUCCESS; 2136d259e05SJens Wiklander case TEE_MAIN_ALGO_DES: 2146d259e05SJens Wiklander case TEE_MAIN_ALGO_DES3: 2156d259e05SJens Wiklander *size = TEE_DES_BLOCK_SIZE; 2166d259e05SJens Wiklander return TEE_SUCCESS; 217ade6f848SJerome Forissier case TEE_MAIN_ALGO_SM4: 218ade6f848SJerome Forissier *size = TEE_SM4_BLOCK_SIZE; 219ade6f848SJerome Forissier return TEE_SUCCESS; 2206d259e05SJens Wiklander default: 2216d259e05SJens Wiklander return TEE_ERROR_NOT_SUPPORTED; 2226d259e05SJens Wiklander } 2236d259e05SJens Wiklander } 2246d259e05SJens Wiklander 2255da36a24SJens Wiklander TEE_Result crypto_mac_alloc_ctx(void **ctx, uint32_t algo) 226e9eaba5cSJens Wiklander { 2275da36a24SJens Wiklander TEE_Result res = TEE_SUCCESS; 2285da36a24SJens Wiklander struct crypto_mac_ctx *c = NULL; 2295da36a24SJens Wiklander 230ea9ac29cSCedric Neveux /* 231ea9ac29cSCedric Neveux * Use default cryptographic implementation if no matching 232ea9ac29cSCedric Neveux * drvcrypt device. 233ea9ac29cSCedric Neveux */ 234ea9ac29cSCedric Neveux res = drvcrypt_mac_alloc_ctx(&c, algo); 235ea9ac29cSCedric Neveux 236ea9ac29cSCedric Neveux if (res == TEE_ERROR_NOT_IMPLEMENTED) { 2375da36a24SJens Wiklander switch (algo) { 2385da36a24SJens Wiklander case TEE_ALG_HMAC_MD5: 2395da36a24SJens Wiklander res = crypto_hmac_md5_alloc_ctx(&c); 2405da36a24SJens Wiklander break; 2415da36a24SJens Wiklander case TEE_ALG_HMAC_SHA1: 2425da36a24SJens Wiklander res = crypto_hmac_sha1_alloc_ctx(&c); 2435da36a24SJens Wiklander break; 2445da36a24SJens Wiklander case TEE_ALG_HMAC_SHA224: 2455da36a24SJens Wiklander res = crypto_hmac_sha224_alloc_ctx(&c); 2465da36a24SJens Wiklander break; 2475da36a24SJens Wiklander case TEE_ALG_HMAC_SHA256: 2485da36a24SJens Wiklander res = crypto_hmac_sha256_alloc_ctx(&c); 2495da36a24SJens Wiklander break; 2505da36a24SJens Wiklander case TEE_ALG_HMAC_SHA384: 2515da36a24SJens Wiklander res = crypto_hmac_sha384_alloc_ctx(&c); 2525da36a24SJens Wiklander break; 2535da36a24SJens Wiklander case TEE_ALG_HMAC_SHA512: 2545da36a24SJens Wiklander res = crypto_hmac_sha512_alloc_ctx(&c); 2555da36a24SJens Wiklander break; 25647645577SJerome Forissier case TEE_ALG_HMAC_SM3: 25747645577SJerome Forissier res = crypto_hmac_sm3_alloc_ctx(&c); 25847645577SJerome Forissier break; 2595da36a24SJens Wiklander case TEE_ALG_AES_CBC_MAC_NOPAD: 2605da36a24SJens Wiklander res = crypto_aes_cbc_mac_nopad_alloc_ctx(&c); 2615da36a24SJens Wiklander break; 2625da36a24SJens Wiklander case TEE_ALG_AES_CBC_MAC_PKCS5: 2635da36a24SJens Wiklander res = crypto_aes_cbc_mac_pkcs5_alloc_ctx(&c); 2645da36a24SJens Wiklander break; 2655da36a24SJens Wiklander case TEE_ALG_DES_CBC_MAC_NOPAD: 2665da36a24SJens Wiklander res = crypto_des_cbc_mac_nopad_alloc_ctx(&c); 2675da36a24SJens Wiklander break; 2685da36a24SJens Wiklander case TEE_ALG_DES_CBC_MAC_PKCS5: 2695da36a24SJens Wiklander res = crypto_des_cbc_mac_pkcs5_alloc_ctx(&c); 2705da36a24SJens Wiklander break; 2715da36a24SJens Wiklander case TEE_ALG_DES3_CBC_MAC_NOPAD: 2725da36a24SJens Wiklander res = crypto_des3_cbc_mac_nopad_alloc_ctx(&c); 2735da36a24SJens Wiklander break; 2745da36a24SJens Wiklander case TEE_ALG_DES3_CBC_MAC_PKCS5: 2755da36a24SJens Wiklander res = crypto_des3_cbc_mac_pkcs5_alloc_ctx(&c); 2765da36a24SJens Wiklander break; 277eee637e7SAlexander Zakharov case TEE_ALG_DES3_CMAC: 278eee637e7SAlexander Zakharov res = crypto_des3_cmac_alloc_ctx(&c); 279eee637e7SAlexander Zakharov break; 2805da36a24SJens Wiklander case TEE_ALG_AES_CMAC: 2815da36a24SJens Wiklander res = crypto_aes_cmac_alloc_ctx(&c); 2825da36a24SJens Wiklander break; 2835da36a24SJens Wiklander default: 2845da36a24SJens Wiklander return TEE_ERROR_NOT_SUPPORTED; 2855da36a24SJens Wiklander } 286ea9ac29cSCedric Neveux } 2875da36a24SJens Wiklander 2885da36a24SJens Wiklander if (!res) 2895da36a24SJens Wiklander *ctx = c; 2905da36a24SJens Wiklander 2915da36a24SJens Wiklander return res; 2925da36a24SJens Wiklander } 2935da36a24SJens Wiklander 2945da36a24SJens Wiklander static const struct crypto_mac_ops *mac_ops(void *ctx) 2955da36a24SJens Wiklander { 2965da36a24SJens Wiklander struct crypto_mac_ctx *c = ctx; 2975da36a24SJens Wiklander 2985da36a24SJens Wiklander assert(c && c->ops); 2995da36a24SJens Wiklander 3005da36a24SJens Wiklander return c->ops; 301e9eaba5cSJens Wiklander } 302e9eaba5cSJens Wiklander 303c69bc615SJens Wiklander void crypto_mac_free_ctx(void *ctx) 30482ef73bcSJens Wiklander { 305ce7a47f5SJerome Forissier if (ctx) 3065da36a24SJens Wiklander mac_ops(ctx)->free_ctx(ctx); 30782ef73bcSJens Wiklander } 30882ef73bcSJens Wiklander 309c69bc615SJens Wiklander void crypto_mac_copy_state(void *dst_ctx, void *src_ctx) 31082ef73bcSJens Wiklander { 3115da36a24SJens Wiklander mac_ops(dst_ctx)->copy_state(dst_ctx, src_ctx); 31282ef73bcSJens Wiklander } 31382ef73bcSJens Wiklander 314c69bc615SJens Wiklander TEE_Result crypto_mac_init(void *ctx, const uint8_t *key, size_t len) 315e9eaba5cSJens Wiklander { 3165da36a24SJens Wiklander return mac_ops(ctx)->init(ctx, key, len); 317e9eaba5cSJens Wiklander } 318e9eaba5cSJens Wiklander 319c69bc615SJens Wiklander TEE_Result crypto_mac_update(void *ctx, const uint8_t *data, size_t len) 320e9eaba5cSJens Wiklander { 3215da36a24SJens Wiklander if (!len) 3225da36a24SJens Wiklander return TEE_SUCCESS; 3235da36a24SJens Wiklander 3245da36a24SJens Wiklander return mac_ops(ctx)->update(ctx, data, len); 325e9eaba5cSJens Wiklander } 326e9eaba5cSJens Wiklander 327c69bc615SJens Wiklander TEE_Result crypto_mac_final(void *ctx, uint8_t *digest, size_t digest_len) 328e9eaba5cSJens Wiklander { 3295da36a24SJens Wiklander return mac_ops(ctx)->final(ctx, digest, digest_len); 330e9eaba5cSJens Wiklander } 331e9eaba5cSJens Wiklander 332d7ac7d0fSJens Wiklander TEE_Result crypto_authenc_alloc_ctx(void **ctx, uint32_t algo) 3338875ce46SJens Wiklander { 334*e3e4ce47SNicolas Toromanoff TEE_Result res = TEE_ERROR_NOT_IMPLEMENTED; 335f1e9b21bSJens Wiklander struct crypto_authenc_ctx *c = NULL; 336f1e9b21bSJens Wiklander 337*e3e4ce47SNicolas Toromanoff /* 338*e3e4ce47SNicolas Toromanoff * Use default authenc implementation if no matching 339*e3e4ce47SNicolas Toromanoff * drvcrypt device. 340*e3e4ce47SNicolas Toromanoff */ 341*e3e4ce47SNicolas Toromanoff res = drvcrypt_authenc_alloc_ctx(&c, algo); 342*e3e4ce47SNicolas Toromanoff 343*e3e4ce47SNicolas Toromanoff if (res == TEE_ERROR_NOT_IMPLEMENTED) { 344d0620b01SJens Wiklander switch (algo) { 345d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM) 346d0620b01SJens Wiklander case TEE_ALG_AES_CCM: 347f1e9b21bSJens Wiklander res = crypto_aes_ccm_alloc_ctx(&c); 348f1e9b21bSJens Wiklander break; 349d0620b01SJens Wiklander #endif 350d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM) 351d0620b01SJens Wiklander case TEE_ALG_AES_GCM: 352f1e9b21bSJens Wiklander res = crypto_aes_gcm_alloc_ctx(&c); 353f1e9b21bSJens Wiklander break; 354d0620b01SJens Wiklander #endif 355d0620b01SJens Wiklander default: 356*e3e4ce47SNicolas Toromanoff break; 357*e3e4ce47SNicolas Toromanoff } 3588875ce46SJens Wiklander } 359f1e9b21bSJens Wiklander 360f1e9b21bSJens Wiklander if (!res) 361f1e9b21bSJens Wiklander *ctx = c; 362f1e9b21bSJens Wiklander 363f1e9b21bSJens Wiklander return res; 364d0620b01SJens Wiklander } 3658875ce46SJens Wiklander 366f1e9b21bSJens Wiklander static const struct crypto_authenc_ops *ae_ops(void *ctx) 367d7ac7d0fSJens Wiklander { 368f1e9b21bSJens Wiklander struct crypto_authenc_ctx *c = ctx; 369f1e9b21bSJens Wiklander 370f1e9b21bSJens Wiklander assert(c && c->ops); 371f1e9b21bSJens Wiklander 372f1e9b21bSJens Wiklander return c->ops; 373d7ac7d0fSJens Wiklander } 374d7ac7d0fSJens Wiklander 37552ee414bSJens Wiklander TEE_Result crypto_authenc_init(void *ctx, TEE_OperationMode mode, 376f1e9b21bSJens Wiklander const uint8_t *key, size_t key_len, 377f1e9b21bSJens Wiklander const uint8_t *nonce, size_t nonce_len, 378f1e9b21bSJens Wiklander size_t tag_len, size_t aad_len, 379f1e9b21bSJens Wiklander size_t payload_len) 380d7ac7d0fSJens Wiklander { 381f1e9b21bSJens Wiklander return ae_ops(ctx)->init(ctx, mode, key, key_len, nonce, nonce_len, 382f1e9b21bSJens Wiklander tag_len, aad_len, payload_len); 383d7ac7d0fSJens Wiklander } 384d7ac7d0fSJens Wiklander 38552ee414bSJens Wiklander TEE_Result crypto_authenc_update_aad(void *ctx, TEE_OperationMode mode __unused, 386f1e9b21bSJens Wiklander const uint8_t *data, size_t len) 3878875ce46SJens Wiklander { 388f1e9b21bSJens Wiklander return ae_ops(ctx)->update_aad(ctx, data, len); 389d0620b01SJens Wiklander } 3908875ce46SJens Wiklander 391d0620b01SJens Wiklander 39252ee414bSJens Wiklander TEE_Result crypto_authenc_update_payload(void *ctx, TEE_OperationMode mode, 393f1e9b21bSJens Wiklander const uint8_t *src_data, 394f1e9b21bSJens Wiklander size_t src_len, uint8_t *dst_data, 395f1e9b21bSJens Wiklander size_t *dst_len) 396f1e9b21bSJens Wiklander { 397f1e9b21bSJens Wiklander if (*dst_len < src_len) 398d0620b01SJens Wiklander return TEE_ERROR_SHORT_BUFFER; 399d0620b01SJens Wiklander *dst_len = src_len; 400d0620b01SJens Wiklander 401f1e9b21bSJens Wiklander return ae_ops(ctx)->update_payload(ctx, mode, src_data, src_len, 402f1e9b21bSJens Wiklander dst_data); 403d0620b01SJens Wiklander } 4048875ce46SJens Wiklander 40552ee414bSJens Wiklander TEE_Result crypto_authenc_enc_final(void *ctx, const uint8_t *src_data, 40652ee414bSJens Wiklander size_t src_len, uint8_t *dst_data, 40752ee414bSJens Wiklander size_t *dst_len, uint8_t *dst_tag, 40852ee414bSJens Wiklander size_t *dst_tag_len) 4098875ce46SJens Wiklander { 410f1e9b21bSJens Wiklander if (*dst_len < src_len) 411f1e9b21bSJens Wiklander return TEE_ERROR_SHORT_BUFFER; 412d0620b01SJens Wiklander *dst_len = src_len; 413d0620b01SJens Wiklander 414f1e9b21bSJens Wiklander return ae_ops(ctx)->enc_final(ctx, src_data, src_len, dst_data, 415f1e9b21bSJens Wiklander dst_tag, dst_tag_len); 4168875ce46SJens Wiklander } 4178875ce46SJens Wiklander 41852ee414bSJens Wiklander TEE_Result crypto_authenc_dec_final(void *ctx, const uint8_t *src_data, 41952ee414bSJens Wiklander size_t src_len, uint8_t *dst_data, 42052ee414bSJens Wiklander size_t *dst_len, const uint8_t *tag, 42152ee414bSJens Wiklander size_t tag_len) 4228875ce46SJens Wiklander { 423f1e9b21bSJens Wiklander if (*dst_len < src_len) 424f1e9b21bSJens Wiklander return TEE_ERROR_SHORT_BUFFER; 425f1e9b21bSJens Wiklander *dst_len = src_len; 426f1e9b21bSJens Wiklander 427f1e9b21bSJens Wiklander return ae_ops(ctx)->dec_final(ctx, src_data, src_len, dst_data, tag, 428f1e9b21bSJens Wiklander tag_len); 4298875ce46SJens Wiklander } 430f1e9b21bSJens Wiklander 43152ee414bSJens Wiklander void crypto_authenc_final(void *ctx) 432f1e9b21bSJens Wiklander { 433f1e9b21bSJens Wiklander ae_ops(ctx)->final(ctx); 434f1e9b21bSJens Wiklander } 435f1e9b21bSJens Wiklander 43652ee414bSJens Wiklander void crypto_authenc_free_ctx(void *ctx) 437f1e9b21bSJens Wiklander { 438f1e9b21bSJens Wiklander if (ctx) 439f1e9b21bSJens Wiklander ae_ops(ctx)->free_ctx(ctx); 440f1e9b21bSJens Wiklander } 441f1e9b21bSJens Wiklander 44252ee414bSJens Wiklander void crypto_authenc_copy_state(void *dst_ctx, void *src_ctx) 443f1e9b21bSJens Wiklander { 444f1e9b21bSJens Wiklander ae_ops(dst_ctx)->copy_state(dst_ctx, src_ctx); 445d0620b01SJens Wiklander } 44633790cc1SJens Wiklander 447da1de557SJens Wiklander #if !defined(CFG_CRYPTO_RSA) && !defined(CFG_CRYPTO_DSA) && \ 448da1de557SJens Wiklander !defined(CFG_CRYPTO_DH) && !defined(CFG_CRYPTO_ECC) 44933790cc1SJens Wiklander struct bignum *crypto_bignum_allocate(size_t size_bits __unused) 45033790cc1SJens Wiklander { 45133790cc1SJens Wiklander return NULL; 45233790cc1SJens Wiklander } 45333790cc1SJens Wiklander 45433790cc1SJens Wiklander TEE_Result crypto_bignum_bin2bn(const uint8_t *from __unused, 45533790cc1SJens Wiklander size_t fromsize __unused, 45633790cc1SJens Wiklander struct bignum *to __unused) 45733790cc1SJens Wiklander { 45833790cc1SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 45933790cc1SJens Wiklander } 46033790cc1SJens Wiklander 46133790cc1SJens Wiklander size_t crypto_bignum_num_bytes(struct bignum *a __unused) 46233790cc1SJens Wiklander { 46333790cc1SJens Wiklander return 0; 46433790cc1SJens Wiklander } 46533790cc1SJens Wiklander 46633790cc1SJens Wiklander size_t crypto_bignum_num_bits(struct bignum *a __unused) 46733790cc1SJens Wiklander { 46833790cc1SJens Wiklander return 0; 46933790cc1SJens Wiklander } 47033790cc1SJens Wiklander 47133790cc1SJens Wiklander /* 47233790cc1SJens Wiklander * crypto_bignum_allocate() and crypto_bignum_bin2bn() failing should be 47333790cc1SJens Wiklander * enough to guarantee that the functions calling this function aren't 47433790cc1SJens Wiklander * called, but just in case add a panic() here to avoid unexpected 47533790cc1SJens Wiklander * behavoir. 47633790cc1SJens Wiklander */ 47733790cc1SJens Wiklander static void bignum_cant_happen(void) 47833790cc1SJens Wiklander { 47933790cc1SJens Wiklander volatile bool b = true; 48033790cc1SJens Wiklander 48133790cc1SJens Wiklander /* Avoid warning about function does not return */ 48233790cc1SJens Wiklander if (b) 48333790cc1SJens Wiklander panic(); 48433790cc1SJens Wiklander } 48533790cc1SJens Wiklander 48633790cc1SJens Wiklander void crypto_bignum_bn2bin(const struct bignum *from __unused, 48733790cc1SJens Wiklander uint8_t *to __unused) 48833790cc1SJens Wiklander { 48933790cc1SJens Wiklander bignum_cant_happen(); 49033790cc1SJens Wiklander } 49133790cc1SJens Wiklander 49233790cc1SJens Wiklander void crypto_bignum_copy(struct bignum *to __unused, 49333790cc1SJens Wiklander const struct bignum *from __unused) 49433790cc1SJens Wiklander { 49533790cc1SJens Wiklander bignum_cant_happen(); 49633790cc1SJens Wiklander } 49733790cc1SJens Wiklander 49833790cc1SJens Wiklander void crypto_bignum_free(struct bignum *a) 49933790cc1SJens Wiklander { 50033790cc1SJens Wiklander if (a) 50133790cc1SJens Wiklander panic(); 50233790cc1SJens Wiklander } 50333790cc1SJens Wiklander 50433790cc1SJens Wiklander void crypto_bignum_clear(struct bignum *a __unused) 50533790cc1SJens Wiklander { 50633790cc1SJens Wiklander bignum_cant_happen(); 50733790cc1SJens Wiklander } 50833790cc1SJens Wiklander 50933790cc1SJens Wiklander /* return -1 if a<b, 0 if a==b, +1 if a>b */ 51033790cc1SJens Wiklander int32_t crypto_bignum_compare(struct bignum *a __unused, 51133790cc1SJens Wiklander struct bignum *b __unused) 51233790cc1SJens Wiklander { 51333790cc1SJens Wiklander bignum_cant_happen(); 51433790cc1SJens Wiklander return -1; 51533790cc1SJens Wiklander } 516da1de557SJens Wiklander #endif 517291e5450SJens Wiklander 518da1de557SJens Wiklander #if !defined(CFG_CRYPTO_RSA) 519291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_rsa_keypair(struct rsa_keypair *s __unused, 520291e5450SJens Wiklander size_t key_size_bits __unused) 521291e5450SJens Wiklander { 522291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 523291e5450SJens Wiklander } 524291e5450SJens Wiklander 525291e5450SJens Wiklander TEE_Result 526291e5450SJens Wiklander crypto_acipher_alloc_rsa_public_key(struct rsa_public_key *s __unused, 527291e5450SJens Wiklander size_t key_size_bits __unused) 528291e5450SJens Wiklander { 529291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 530291e5450SJens Wiklander } 531291e5450SJens Wiklander 532291e5450SJens Wiklander void crypto_acipher_free_rsa_public_key(struct rsa_public_key *s __unused) 533291e5450SJens Wiklander { 534291e5450SJens Wiklander } 535291e5450SJens Wiklander 536a1d5c81fSElias von Däniken void crypto_acipher_free_rsa_keypair(struct rsa_keypair *s __unused) 537a1d5c81fSElias von Däniken { 538a1d5c81fSElias von Däniken } 539a1d5c81fSElias von Däniken 540291e5450SJens Wiklander TEE_Result crypto_acipher_gen_rsa_key(struct rsa_keypair *key __unused, 541291e5450SJens Wiklander size_t key_size __unused) 542291e5450SJens Wiklander { 543291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 544291e5450SJens Wiklander } 545291e5450SJens Wiklander 546291e5450SJens Wiklander TEE_Result crypto_acipher_rsanopad_decrypt(struct rsa_keypair *key __unused, 547291e5450SJens Wiklander const uint8_t *src __unused, 548291e5450SJens Wiklander size_t src_len __unused, 549291e5450SJens Wiklander uint8_t *dst __unused, 550291e5450SJens Wiklander size_t *dst_len __unused) 551291e5450SJens Wiklander { 552291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 553291e5450SJens Wiklander } 554291e5450SJens Wiklander 555291e5450SJens Wiklander TEE_Result crypto_acipher_rsanopad_encrypt(struct rsa_public_key *key __unused, 556291e5450SJens Wiklander const uint8_t *src __unused, 557291e5450SJens Wiklander size_t src_len __unused, 558291e5450SJens Wiklander uint8_t *dst __unused, 559291e5450SJens Wiklander size_t *dst_len __unused) 560291e5450SJens Wiklander { 561291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 562291e5450SJens Wiklander } 563291e5450SJens Wiklander 564291e5450SJens Wiklander TEE_Result crypto_acipher_rsaes_decrypt(uint32_t algo __unused, 565291e5450SJens Wiklander struct rsa_keypair *key __unused, 566291e5450SJens Wiklander const uint8_t *label __unused, 567291e5450SJens Wiklander size_t label_len __unused, 568291e5450SJens Wiklander const uint8_t *src __unused, 569291e5450SJens Wiklander size_t src_len __unused, 570291e5450SJens Wiklander uint8_t *dst __unused, 571291e5450SJens Wiklander size_t *dst_len __unused) 572291e5450SJens Wiklander { 573291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 574291e5450SJens Wiklander } 575291e5450SJens Wiklander 576291e5450SJens Wiklander TEE_Result crypto_acipher_rsaes_encrypt(uint32_t algo __unused, 577291e5450SJens Wiklander struct rsa_public_key *key __unused, 578291e5450SJens Wiklander const uint8_t *label __unused, 579291e5450SJens Wiklander size_t label_len __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_rsassa_sign(uint32_t algo __unused, 589291e5450SJens Wiklander struct rsa_keypair *key __unused, 590291e5450SJens Wiklander int salt_len __unused, 591291e5450SJens Wiklander const uint8_t *msg __unused, 592291e5450SJens Wiklander size_t msg_len __unused, 593291e5450SJens Wiklander uint8_t *sig __unused, 594291e5450SJens Wiklander size_t *sig_len __unused) 595291e5450SJens Wiklander { 596291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 597291e5450SJens Wiklander } 598291e5450SJens Wiklander 599291e5450SJens Wiklander TEE_Result crypto_acipher_rsassa_verify(uint32_t algo __unused, 600291e5450SJens Wiklander struct rsa_public_key *key __unused, 601291e5450SJens Wiklander int salt_len __unused, 602291e5450SJens Wiklander const uint8_t *msg __unused, 603291e5450SJens Wiklander size_t msg_len __unused, 604291e5450SJens Wiklander const uint8_t *sig __unused, 605291e5450SJens Wiklander size_t sig_len __unused) 606291e5450SJens Wiklander { 607291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 608291e5450SJens Wiklander } 609da1de557SJens Wiklander #endif /*!CFG_CRYPTO_RSA*/ 610291e5450SJens Wiklander 611da1de557SJens Wiklander #if !defined(CFG_CRYPTO_DSA) 612291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_dsa_keypair(struct dsa_keypair *s __unused, 613291e5450SJens Wiklander size_t key_size_bits __unused) 614291e5450SJens Wiklander { 615291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 616291e5450SJens Wiklander } 617291e5450SJens Wiklander 618291e5450SJens Wiklander TEE_Result 619291e5450SJens Wiklander crypto_acipher_alloc_dsa_public_key(struct dsa_public_key *s __unused, 620291e5450SJens Wiklander size_t key_size_bits __unused) 621291e5450SJens Wiklander { 622291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 623291e5450SJens Wiklander } 624291e5450SJens Wiklander 625291e5450SJens Wiklander TEE_Result crypto_acipher_gen_dsa_key(struct dsa_keypair *key __unused, 626291e5450SJens Wiklander size_t key_size __unused) 627291e5450SJens Wiklander { 628291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 629291e5450SJens Wiklander } 630291e5450SJens Wiklander 631291e5450SJens Wiklander TEE_Result crypto_acipher_dsa_sign(uint32_t algo __unused, 632291e5450SJens Wiklander struct dsa_keypair *key __unused, 633291e5450SJens Wiklander const uint8_t *msg __unused, 634291e5450SJens Wiklander size_t msg_len __unused, 635291e5450SJens Wiklander uint8_t *sig __unused, 636291e5450SJens Wiklander size_t *sig_len __unused) 637291e5450SJens Wiklander { 638291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 639291e5450SJens Wiklander } 640291e5450SJens Wiklander 641291e5450SJens Wiklander TEE_Result crypto_acipher_dsa_verify(uint32_t algo __unused, 642291e5450SJens Wiklander struct dsa_public_key *key __unused, 643291e5450SJens Wiklander const uint8_t *msg __unused, 644291e5450SJens Wiklander size_t msg_len __unused, 645291e5450SJens Wiklander const uint8_t *sig __unused, 646291e5450SJens Wiklander size_t sig_len __unused) 647291e5450SJens Wiklander { 648291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 649291e5450SJens Wiklander } 650da1de557SJens Wiklander #endif /*!CFG_CRYPTO_DSA*/ 651291e5450SJens Wiklander 652da1de557SJens Wiklander #if !defined(CFG_CRYPTO_DH) 653291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_dh_keypair(struct dh_keypair *s __unused, 654291e5450SJens Wiklander size_t key_size_bits __unused) 655291e5450SJens Wiklander { 656291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 657291e5450SJens Wiklander } 658291e5450SJens Wiklander 659291e5450SJens Wiklander TEE_Result crypto_acipher_gen_dh_key(struct dh_keypair *key __unused, 660291e5450SJens Wiklander struct bignum *q __unused, 6619f4dcefbSJerome Forissier size_t xbits __unused, 6629f4dcefbSJerome Forissier size_t key_size __unused) 663291e5450SJens Wiklander { 664291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 665291e5450SJens Wiklander } 666291e5450SJens Wiklander 667291e5450SJens Wiklander TEE_Result 668291e5450SJens Wiklander crypto_acipher_dh_shared_secret(struct dh_keypair *private_key __unused, 669291e5450SJens Wiklander struct bignum *public_key __unused, 670291e5450SJens Wiklander struct bignum *secret __unused) 671291e5450SJens Wiklander { 672291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 673291e5450SJens Wiklander } 674da1de557SJens Wiklander #endif /*!CFG_CRYPTO_DH*/ 675291e5450SJens Wiklander 676df00cf59SCedric Neveux TEE_Result crypto_acipher_alloc_ecc_public_key(struct ecc_public_key *key, 677df00cf59SCedric Neveux uint32_t key_type, 678df00cf59SCedric Neveux size_t key_size_bits) 679291e5450SJens Wiklander { 680df00cf59SCedric Neveux TEE_Result res = TEE_ERROR_NOT_IMPLEMENTED; 681df00cf59SCedric Neveux 682df00cf59SCedric Neveux /* 683df00cf59SCedric Neveux * Use default cryptographic implementation if no matching 684df00cf59SCedric Neveux * drvcrypt device. 685df00cf59SCedric Neveux */ 686df00cf59SCedric Neveux res = drvcrypt_asym_alloc_ecc_public_key(key, key_type, key_size_bits); 687df00cf59SCedric Neveux if (res == TEE_ERROR_NOT_IMPLEMENTED) 688df00cf59SCedric Neveux res = crypto_asym_alloc_ecc_public_key(key, key_type, 689df00cf59SCedric Neveux key_size_bits); 690df00cf59SCedric Neveux 691df00cf59SCedric Neveux return res; 692291e5450SJens Wiklander } 693291e5450SJens Wiklander 694df00cf59SCedric Neveux TEE_Result crypto_acipher_alloc_ecc_keypair(struct ecc_keypair *key, 695df00cf59SCedric Neveux uint32_t key_type, 696df00cf59SCedric Neveux size_t key_size_bits) 697291e5450SJens Wiklander { 698df00cf59SCedric Neveux TEE_Result res = TEE_ERROR_NOT_IMPLEMENTED; 699df00cf59SCedric Neveux 700df00cf59SCedric Neveux /* 701df00cf59SCedric Neveux * Use default cryptographic implementation if no matching 702df00cf59SCedric Neveux * drvcrypt device. 703df00cf59SCedric Neveux */ 704df00cf59SCedric Neveux res = drvcrypt_asym_alloc_ecc_keypair(key, key_type, key_size_bits); 705df00cf59SCedric Neveux if (res == TEE_ERROR_NOT_IMPLEMENTED) 706df00cf59SCedric Neveux res = crypto_asym_alloc_ecc_keypair(key, key_type, 707df00cf59SCedric Neveux key_size_bits); 708df00cf59SCedric Neveux 709df00cf59SCedric Neveux return res; 710291e5450SJens Wiklander } 711291e5450SJens Wiklander 712df00cf59SCedric Neveux void crypto_acipher_free_ecc_public_key(struct ecc_public_key *key) 713291e5450SJens Wiklander { 714df00cf59SCedric Neveux assert(key->ops && key->ops->free); 715df00cf59SCedric Neveux 716df00cf59SCedric Neveux key->ops->free(key); 717291e5450SJens Wiklander } 718291e5450SJens Wiklander 719df00cf59SCedric Neveux TEE_Result crypto_acipher_gen_ecc_key(struct ecc_keypair *key, 720df00cf59SCedric Neveux size_t key_size_bits) 721291e5450SJens Wiklander { 722df00cf59SCedric Neveux assert(key->ops && key->ops->generate); 723df00cf59SCedric Neveux 724df00cf59SCedric Neveux return key->ops->generate(key, key_size_bits); 725291e5450SJens Wiklander } 726291e5450SJens Wiklander 727df00cf59SCedric Neveux TEE_Result crypto_acipher_ecc_sign(uint32_t algo, struct ecc_keypair *key, 728df00cf59SCedric Neveux const uint8_t *msg, size_t msg_len, 729df00cf59SCedric Neveux uint8_t *sig, size_t *sig_len) 730291e5450SJens Wiklander { 731df00cf59SCedric Neveux assert(key->ops); 732df00cf59SCedric Neveux 733df00cf59SCedric Neveux if (!key->ops->sign) 734291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 735df00cf59SCedric Neveux 736df00cf59SCedric Neveux return key->ops->sign(algo, key, msg, msg_len, sig, sig_len); 737291e5450SJens Wiklander } 738291e5450SJens Wiklander 739df00cf59SCedric Neveux TEE_Result crypto_acipher_ecc_verify(uint32_t algo, struct ecc_public_key *key, 740df00cf59SCedric Neveux const uint8_t *msg, size_t msg_len, 741df00cf59SCedric Neveux const uint8_t *sig, size_t sig_len) 742291e5450SJens Wiklander { 743df00cf59SCedric Neveux assert(key->ops); 744df00cf59SCedric Neveux 745df00cf59SCedric Neveux if (!key->ops->verify) 746291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 747df00cf59SCedric Neveux 748df00cf59SCedric Neveux return key->ops->verify(algo, key, msg, msg_len, sig, sig_len); 749291e5450SJens Wiklander } 750291e5450SJens Wiklander 751df00cf59SCedric Neveux TEE_Result crypto_acipher_ecc_shared_secret(struct ecc_keypair *private_key, 752df00cf59SCedric Neveux struct ecc_public_key *public_key, 753df00cf59SCedric Neveux void *secret, 754df00cf59SCedric Neveux unsigned long *secret_len) 755291e5450SJens Wiklander { 756df00cf59SCedric Neveux assert(private_key->ops); 757df00cf59SCedric Neveux 758df00cf59SCedric Neveux if (!private_key->ops->shared_secret) 759291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 760df00cf59SCedric Neveux 761df00cf59SCedric Neveux return private_key->ops->shared_secret(private_key, public_key, secret, 762df00cf59SCedric Neveux secret_len); 763291e5450SJens Wiklander } 76491fc6bd8SJerome Forissier 765884fd190SCedric Neveux TEE_Result crypto_acipher_sm2_pke_decrypt(struct ecc_keypair *key, 766884fd190SCedric Neveux const uint8_t *src, size_t src_len, 767884fd190SCedric Neveux uint8_t *dst, size_t *dst_len) 76891fc6bd8SJerome Forissier { 769884fd190SCedric Neveux assert(key->ops); 770884fd190SCedric Neveux 771884fd190SCedric Neveux if (!key->ops->decrypt) 77291fc6bd8SJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED; 773884fd190SCedric Neveux 774884fd190SCedric Neveux return key->ops->decrypt(key, src, src_len, dst, dst_len); 77591fc6bd8SJerome Forissier } 77691fc6bd8SJerome Forissier 777884fd190SCedric Neveux TEE_Result crypto_acipher_sm2_pke_encrypt(struct ecc_public_key *key, 778884fd190SCedric Neveux const uint8_t *src, size_t src_len, 779884fd190SCedric Neveux uint8_t *dst, size_t *dst_len) 78091fc6bd8SJerome Forissier { 781884fd190SCedric Neveux assert(key->ops); 782884fd190SCedric Neveux 783884fd190SCedric Neveux if (!key->ops->encrypt) 78491fc6bd8SJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED; 785884fd190SCedric Neveux 786884fd190SCedric Neveux return key->ops->encrypt(key, src, src_len, dst, dst_len); 78791fc6bd8SJerome Forissier } 7880f151943SJerome Forissier 7895b385b3fSJerome Forissier #if !defined(CFG_CRYPTO_SM2_KEP) 7905b385b3fSJerome Forissier TEE_Result crypto_acipher_sm2_kep_derive(struct ecc_keypair *my_key __unused, 7915b385b3fSJerome Forissier struct ecc_keypair *my_eph_key 7925b385b3fSJerome Forissier __unused, 7935b385b3fSJerome Forissier struct ecc_public_key *peer_key 7945b385b3fSJerome Forissier __unused, 7955b385b3fSJerome Forissier struct ecc_public_key *peer_eph_key 7965b385b3fSJerome Forissier __unused, 7975b385b3fSJerome Forissier struct sm2_kep_parms *p __unused) 7985b385b3fSJerome Forissier { 7995b385b3fSJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED; 8005b385b3fSJerome Forissier } 8015b385b3fSJerome Forissier #endif 8025dfe86d0SJorge Ramirez-Ortiz 8035dfe86d0SJorge Ramirez-Ortiz __weak void crypto_storage_obj_del(uint8_t *data __unused, size_t len __unused) 8045dfe86d0SJorge Ramirez-Ortiz { 8055dfe86d0SJorge Ramirez-Ortiz } 806