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; 146*b21f583dSPingan Xie case TEE_ALG_SM4_XTS: 147*b21f583dSPingan Xie res = crypto_sm4_xts_alloc_ctx(&c); 148*b21f583dSPingan Xie break; 14996098f01SJens Wiklander default: 1501c5fdd1fSJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED; 15182d91db1SJens Wiklander } 152e43ab7a8SCedric Neveux } 15382d91db1SJens Wiklander 15496098f01SJens Wiklander if (!res) 15596098f01SJens Wiklander *ctx = c; 15696098f01SJens Wiklander 15796098f01SJens Wiklander return res; 15896098f01SJens Wiklander } 15996098f01SJens Wiklander 16096098f01SJens Wiklander static const struct crypto_cipher_ops *cipher_ops(void *ctx) 16196098f01SJens Wiklander { 16296098f01SJens Wiklander struct crypto_cipher_ctx *c = ctx; 16396098f01SJens Wiklander 16496098f01SJens Wiklander assert(c && c->ops); 16596098f01SJens Wiklander 16696098f01SJens Wiklander return c->ops; 16796098f01SJens Wiklander } 16896098f01SJens Wiklander 169cbda7091SJens Wiklander void crypto_cipher_free_ctx(void *ctx) 17072a9b1a0SJens Wiklander { 171ce7a47f5SJerome Forissier if (ctx) 17296098f01SJens Wiklander cipher_ops(ctx)->free_ctx(ctx); 17372a9b1a0SJens Wiklander } 17472a9b1a0SJens Wiklander 175cbda7091SJens Wiklander void crypto_cipher_copy_state(void *dst_ctx, void *src_ctx) 17672a9b1a0SJens Wiklander { 17796098f01SJens Wiklander cipher_ops(dst_ctx)->copy_state(dst_ctx, src_ctx); 17872a9b1a0SJens Wiklander } 17972a9b1a0SJens Wiklander 180cbda7091SJens Wiklander TEE_Result crypto_cipher_init(void *ctx, TEE_OperationMode mode, 181cbda7091SJens Wiklander const uint8_t *key1, size_t key1_len, 182cbda7091SJens Wiklander const uint8_t *key2, size_t key2_len, 183cbda7091SJens Wiklander const uint8_t *iv, size_t iv_len) 18482d91db1SJens Wiklander { 18596098f01SJens Wiklander if (mode != TEE_MODE_DECRYPT && mode != TEE_MODE_ENCRYPT) 18696098f01SJens Wiklander return TEE_ERROR_BAD_PARAMETERS; 18796098f01SJens Wiklander 18896098f01SJens Wiklander return cipher_ops(ctx)->init(ctx, mode, key1, key1_len, key2, key2_len, 18996098f01SJens Wiklander iv, iv_len); 19082d91db1SJens Wiklander } 19182d91db1SJens Wiklander 192cbda7091SJens Wiklander TEE_Result crypto_cipher_update(void *ctx, TEE_OperationMode mode __unused, 19396098f01SJens Wiklander bool last_block, const uint8_t *data, 19496098f01SJens Wiklander size_t len, uint8_t *dst) 19582d91db1SJens Wiklander { 19696098f01SJens Wiklander return cipher_ops(ctx)->update(ctx, last_block, data, len, dst); 19782d91db1SJens Wiklander } 19882d91db1SJens Wiklander 199cbda7091SJens Wiklander void crypto_cipher_final(void *ctx) 20082d91db1SJens Wiklander { 20196098f01SJens Wiklander cipher_ops(ctx)->final(ctx); 20282d91db1SJens Wiklander } 203e9eaba5cSJens Wiklander 2046d259e05SJens Wiklander TEE_Result crypto_cipher_get_block_size(uint32_t algo, size_t *size) 2056d259e05SJens Wiklander { 2066d259e05SJens Wiklander uint32_t class = TEE_ALG_GET_CLASS(algo); 2076d259e05SJens Wiklander 2086d259e05SJens Wiklander if (class != TEE_OPERATION_CIPHER && class != TEE_OPERATION_MAC && 2096d259e05SJens Wiklander class != TEE_OPERATION_AE) 2106d259e05SJens Wiklander return TEE_ERROR_BAD_PARAMETERS; 2116d259e05SJens Wiklander 2126d259e05SJens Wiklander switch (TEE_ALG_GET_MAIN_ALG(algo)) { 2136d259e05SJens Wiklander case TEE_MAIN_ALGO_AES: 2146d259e05SJens Wiklander *size = TEE_AES_BLOCK_SIZE; 2156d259e05SJens Wiklander return TEE_SUCCESS; 2166d259e05SJens Wiklander case TEE_MAIN_ALGO_DES: 2176d259e05SJens Wiklander case TEE_MAIN_ALGO_DES3: 2186d259e05SJens Wiklander *size = TEE_DES_BLOCK_SIZE; 2196d259e05SJens Wiklander return TEE_SUCCESS; 220ade6f848SJerome Forissier case TEE_MAIN_ALGO_SM4: 221ade6f848SJerome Forissier *size = TEE_SM4_BLOCK_SIZE; 222ade6f848SJerome Forissier return TEE_SUCCESS; 2236d259e05SJens Wiklander default: 2246d259e05SJens Wiklander return TEE_ERROR_NOT_SUPPORTED; 2256d259e05SJens Wiklander } 2266d259e05SJens Wiklander } 2276d259e05SJens Wiklander 2285da36a24SJens Wiklander TEE_Result crypto_mac_alloc_ctx(void **ctx, uint32_t algo) 229e9eaba5cSJens Wiklander { 2305da36a24SJens Wiklander TEE_Result res = TEE_SUCCESS; 2315da36a24SJens Wiklander struct crypto_mac_ctx *c = NULL; 2325da36a24SJens Wiklander 233ea9ac29cSCedric Neveux /* 234ea9ac29cSCedric Neveux * Use default cryptographic implementation if no matching 235ea9ac29cSCedric Neveux * drvcrypt device. 236ea9ac29cSCedric Neveux */ 237ea9ac29cSCedric Neveux res = drvcrypt_mac_alloc_ctx(&c, algo); 238ea9ac29cSCedric Neveux 239ea9ac29cSCedric Neveux if (res == TEE_ERROR_NOT_IMPLEMENTED) { 2405da36a24SJens Wiklander switch (algo) { 2415da36a24SJens Wiklander case TEE_ALG_HMAC_MD5: 2425da36a24SJens Wiklander res = crypto_hmac_md5_alloc_ctx(&c); 2435da36a24SJens Wiklander break; 2445da36a24SJens Wiklander case TEE_ALG_HMAC_SHA1: 2455da36a24SJens Wiklander res = crypto_hmac_sha1_alloc_ctx(&c); 2465da36a24SJens Wiklander break; 2475da36a24SJens Wiklander case TEE_ALG_HMAC_SHA224: 2485da36a24SJens Wiklander res = crypto_hmac_sha224_alloc_ctx(&c); 2495da36a24SJens Wiklander break; 2505da36a24SJens Wiklander case TEE_ALG_HMAC_SHA256: 2515da36a24SJens Wiklander res = crypto_hmac_sha256_alloc_ctx(&c); 2525da36a24SJens Wiklander break; 2535da36a24SJens Wiklander case TEE_ALG_HMAC_SHA384: 2545da36a24SJens Wiklander res = crypto_hmac_sha384_alloc_ctx(&c); 2555da36a24SJens Wiklander break; 2565da36a24SJens Wiklander case TEE_ALG_HMAC_SHA512: 2575da36a24SJens Wiklander res = crypto_hmac_sha512_alloc_ctx(&c); 2585da36a24SJens Wiklander break; 25947645577SJerome Forissier case TEE_ALG_HMAC_SM3: 26047645577SJerome Forissier res = crypto_hmac_sm3_alloc_ctx(&c); 26147645577SJerome Forissier break; 2625da36a24SJens Wiklander case TEE_ALG_AES_CBC_MAC_NOPAD: 2635da36a24SJens Wiklander res = crypto_aes_cbc_mac_nopad_alloc_ctx(&c); 2645da36a24SJens Wiklander break; 2655da36a24SJens Wiklander case TEE_ALG_AES_CBC_MAC_PKCS5: 2665da36a24SJens Wiklander res = crypto_aes_cbc_mac_pkcs5_alloc_ctx(&c); 2675da36a24SJens Wiklander break; 2685da36a24SJens Wiklander case TEE_ALG_DES_CBC_MAC_NOPAD: 2695da36a24SJens Wiklander res = crypto_des_cbc_mac_nopad_alloc_ctx(&c); 2705da36a24SJens Wiklander break; 2715da36a24SJens Wiklander case TEE_ALG_DES_CBC_MAC_PKCS5: 2725da36a24SJens Wiklander res = crypto_des_cbc_mac_pkcs5_alloc_ctx(&c); 2735da36a24SJens Wiklander break; 2745da36a24SJens Wiklander case TEE_ALG_DES3_CBC_MAC_NOPAD: 2755da36a24SJens Wiklander res = crypto_des3_cbc_mac_nopad_alloc_ctx(&c); 2765da36a24SJens Wiklander break; 2775da36a24SJens Wiklander case TEE_ALG_DES3_CBC_MAC_PKCS5: 2785da36a24SJens Wiklander res = crypto_des3_cbc_mac_pkcs5_alloc_ctx(&c); 2795da36a24SJens Wiklander break; 280eee637e7SAlexander Zakharov case TEE_ALG_DES3_CMAC: 281eee637e7SAlexander Zakharov res = crypto_des3_cmac_alloc_ctx(&c); 282eee637e7SAlexander Zakharov break; 2835da36a24SJens Wiklander case TEE_ALG_AES_CMAC: 2845da36a24SJens Wiklander res = crypto_aes_cmac_alloc_ctx(&c); 2855da36a24SJens Wiklander break; 2865da36a24SJens Wiklander default: 2875da36a24SJens Wiklander return TEE_ERROR_NOT_SUPPORTED; 2885da36a24SJens Wiklander } 289ea9ac29cSCedric Neveux } 2905da36a24SJens Wiklander 2915da36a24SJens Wiklander if (!res) 2925da36a24SJens Wiklander *ctx = c; 2935da36a24SJens Wiklander 2945da36a24SJens Wiklander return res; 2955da36a24SJens Wiklander } 2965da36a24SJens Wiklander 2975da36a24SJens Wiklander static const struct crypto_mac_ops *mac_ops(void *ctx) 2985da36a24SJens Wiklander { 2995da36a24SJens Wiklander struct crypto_mac_ctx *c = ctx; 3005da36a24SJens Wiklander 3015da36a24SJens Wiklander assert(c && c->ops); 3025da36a24SJens Wiklander 3035da36a24SJens Wiklander return c->ops; 304e9eaba5cSJens Wiklander } 305e9eaba5cSJens Wiklander 306c69bc615SJens Wiklander void crypto_mac_free_ctx(void *ctx) 30782ef73bcSJens Wiklander { 308ce7a47f5SJerome Forissier if (ctx) 3095da36a24SJens Wiklander mac_ops(ctx)->free_ctx(ctx); 31082ef73bcSJens Wiklander } 31182ef73bcSJens Wiklander 312c69bc615SJens Wiklander void crypto_mac_copy_state(void *dst_ctx, void *src_ctx) 31382ef73bcSJens Wiklander { 3145da36a24SJens Wiklander mac_ops(dst_ctx)->copy_state(dst_ctx, src_ctx); 31582ef73bcSJens Wiklander } 31682ef73bcSJens Wiklander 317c69bc615SJens Wiklander TEE_Result crypto_mac_init(void *ctx, const uint8_t *key, size_t len) 318e9eaba5cSJens Wiklander { 3195da36a24SJens Wiklander return mac_ops(ctx)->init(ctx, key, len); 320e9eaba5cSJens Wiklander } 321e9eaba5cSJens Wiklander 322c69bc615SJens Wiklander TEE_Result crypto_mac_update(void *ctx, const uint8_t *data, size_t len) 323e9eaba5cSJens Wiklander { 3245da36a24SJens Wiklander if (!len) 3255da36a24SJens Wiklander return TEE_SUCCESS; 3265da36a24SJens Wiklander 3275da36a24SJens Wiklander return mac_ops(ctx)->update(ctx, data, len); 328e9eaba5cSJens Wiklander } 329e9eaba5cSJens Wiklander 330c69bc615SJens Wiklander TEE_Result crypto_mac_final(void *ctx, uint8_t *digest, size_t digest_len) 331e9eaba5cSJens Wiklander { 3325da36a24SJens Wiklander return mac_ops(ctx)->final(ctx, digest, digest_len); 333e9eaba5cSJens Wiklander } 334e9eaba5cSJens Wiklander 335d7ac7d0fSJens Wiklander TEE_Result crypto_authenc_alloc_ctx(void **ctx, uint32_t algo) 3368875ce46SJens Wiklander { 337e3e4ce47SNicolas Toromanoff TEE_Result res = TEE_ERROR_NOT_IMPLEMENTED; 338f1e9b21bSJens Wiklander struct crypto_authenc_ctx *c = NULL; 339f1e9b21bSJens Wiklander 340e3e4ce47SNicolas Toromanoff /* 341e3e4ce47SNicolas Toromanoff * Use default authenc implementation if no matching 342e3e4ce47SNicolas Toromanoff * drvcrypt device. 343e3e4ce47SNicolas Toromanoff */ 344e3e4ce47SNicolas Toromanoff res = drvcrypt_authenc_alloc_ctx(&c, algo); 345e3e4ce47SNicolas Toromanoff 346e3e4ce47SNicolas Toromanoff if (res == TEE_ERROR_NOT_IMPLEMENTED) { 347d0620b01SJens Wiklander switch (algo) { 348d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM) 349d0620b01SJens Wiklander case TEE_ALG_AES_CCM: 350f1e9b21bSJens Wiklander res = crypto_aes_ccm_alloc_ctx(&c); 351f1e9b21bSJens Wiklander break; 352d0620b01SJens Wiklander #endif 353d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM) 354d0620b01SJens Wiklander case TEE_ALG_AES_GCM: 355f1e9b21bSJens Wiklander res = crypto_aes_gcm_alloc_ctx(&c); 356f1e9b21bSJens Wiklander break; 357d0620b01SJens Wiklander #endif 358d0620b01SJens Wiklander default: 359e3e4ce47SNicolas Toromanoff break; 360e3e4ce47SNicolas Toromanoff } 3618875ce46SJens Wiklander } 362f1e9b21bSJens Wiklander 363f1e9b21bSJens Wiklander if (!res) 364f1e9b21bSJens Wiklander *ctx = c; 365f1e9b21bSJens Wiklander 366f1e9b21bSJens Wiklander return res; 367d0620b01SJens Wiklander } 3688875ce46SJens Wiklander 369f1e9b21bSJens Wiklander static const struct crypto_authenc_ops *ae_ops(void *ctx) 370d7ac7d0fSJens Wiklander { 371f1e9b21bSJens Wiklander struct crypto_authenc_ctx *c = ctx; 372f1e9b21bSJens Wiklander 373f1e9b21bSJens Wiklander assert(c && c->ops); 374f1e9b21bSJens Wiklander 375f1e9b21bSJens Wiklander return c->ops; 376d7ac7d0fSJens Wiklander } 377d7ac7d0fSJens Wiklander 37852ee414bSJens Wiklander TEE_Result crypto_authenc_init(void *ctx, TEE_OperationMode mode, 379f1e9b21bSJens Wiklander const uint8_t *key, size_t key_len, 380f1e9b21bSJens Wiklander const uint8_t *nonce, size_t nonce_len, 381f1e9b21bSJens Wiklander size_t tag_len, size_t aad_len, 382f1e9b21bSJens Wiklander size_t payload_len) 383d7ac7d0fSJens Wiklander { 384f1e9b21bSJens Wiklander return ae_ops(ctx)->init(ctx, mode, key, key_len, nonce, nonce_len, 385f1e9b21bSJens Wiklander tag_len, aad_len, payload_len); 386d7ac7d0fSJens Wiklander } 387d7ac7d0fSJens Wiklander 38852ee414bSJens Wiklander TEE_Result crypto_authenc_update_aad(void *ctx, TEE_OperationMode mode __unused, 389f1e9b21bSJens Wiklander const uint8_t *data, size_t len) 3908875ce46SJens Wiklander { 391f1e9b21bSJens Wiklander return ae_ops(ctx)->update_aad(ctx, data, len); 392d0620b01SJens Wiklander } 3938875ce46SJens Wiklander 394d0620b01SJens Wiklander 39552ee414bSJens Wiklander TEE_Result crypto_authenc_update_payload(void *ctx, TEE_OperationMode mode, 396f1e9b21bSJens Wiklander const uint8_t *src_data, 397f1e9b21bSJens Wiklander size_t src_len, uint8_t *dst_data, 398f1e9b21bSJens Wiklander size_t *dst_len) 399f1e9b21bSJens Wiklander { 400f1e9b21bSJens Wiklander if (*dst_len < src_len) 401d0620b01SJens Wiklander return TEE_ERROR_SHORT_BUFFER; 402d0620b01SJens Wiklander *dst_len = src_len; 403d0620b01SJens Wiklander 404f1e9b21bSJens Wiklander return ae_ops(ctx)->update_payload(ctx, mode, src_data, src_len, 405f1e9b21bSJens Wiklander dst_data); 406d0620b01SJens Wiklander } 4078875ce46SJens Wiklander 40852ee414bSJens Wiklander TEE_Result crypto_authenc_enc_final(void *ctx, const uint8_t *src_data, 40952ee414bSJens Wiklander size_t src_len, uint8_t *dst_data, 41052ee414bSJens Wiklander size_t *dst_len, uint8_t *dst_tag, 41152ee414bSJens Wiklander size_t *dst_tag_len) 4128875ce46SJens Wiklander { 413f1e9b21bSJens Wiklander if (*dst_len < src_len) 414f1e9b21bSJens Wiklander return TEE_ERROR_SHORT_BUFFER; 415d0620b01SJens Wiklander *dst_len = src_len; 416d0620b01SJens Wiklander 417f1e9b21bSJens Wiklander return ae_ops(ctx)->enc_final(ctx, src_data, src_len, dst_data, 418f1e9b21bSJens Wiklander dst_tag, dst_tag_len); 4198875ce46SJens Wiklander } 4208875ce46SJens Wiklander 42152ee414bSJens Wiklander TEE_Result crypto_authenc_dec_final(void *ctx, const uint8_t *src_data, 42252ee414bSJens Wiklander size_t src_len, uint8_t *dst_data, 42352ee414bSJens Wiklander size_t *dst_len, const uint8_t *tag, 42452ee414bSJens Wiklander size_t tag_len) 4258875ce46SJens Wiklander { 426f1e9b21bSJens Wiklander if (*dst_len < src_len) 427f1e9b21bSJens Wiklander return TEE_ERROR_SHORT_BUFFER; 428f1e9b21bSJens Wiklander *dst_len = src_len; 429f1e9b21bSJens Wiklander 430f1e9b21bSJens Wiklander return ae_ops(ctx)->dec_final(ctx, src_data, src_len, dst_data, tag, 431f1e9b21bSJens Wiklander tag_len); 4328875ce46SJens Wiklander } 433f1e9b21bSJens Wiklander 43452ee414bSJens Wiklander void crypto_authenc_final(void *ctx) 435f1e9b21bSJens Wiklander { 436f1e9b21bSJens Wiklander ae_ops(ctx)->final(ctx); 437f1e9b21bSJens Wiklander } 438f1e9b21bSJens Wiklander 43952ee414bSJens Wiklander void crypto_authenc_free_ctx(void *ctx) 440f1e9b21bSJens Wiklander { 441f1e9b21bSJens Wiklander if (ctx) 442f1e9b21bSJens Wiklander ae_ops(ctx)->free_ctx(ctx); 443f1e9b21bSJens Wiklander } 444f1e9b21bSJens Wiklander 44552ee414bSJens Wiklander void crypto_authenc_copy_state(void *dst_ctx, void *src_ctx) 446f1e9b21bSJens Wiklander { 447f1e9b21bSJens Wiklander ae_ops(dst_ctx)->copy_state(dst_ctx, src_ctx); 448d0620b01SJens Wiklander } 44933790cc1SJens Wiklander 450da1de557SJens Wiklander #if !defined(CFG_CRYPTO_RSA) && !defined(CFG_CRYPTO_DSA) && \ 451da1de557SJens Wiklander !defined(CFG_CRYPTO_DH) && !defined(CFG_CRYPTO_ECC) 45233790cc1SJens Wiklander struct bignum *crypto_bignum_allocate(size_t size_bits __unused) 45333790cc1SJens Wiklander { 45433790cc1SJens Wiklander return NULL; 45533790cc1SJens Wiklander } 45633790cc1SJens Wiklander 45733790cc1SJens Wiklander TEE_Result crypto_bignum_bin2bn(const uint8_t *from __unused, 45833790cc1SJens Wiklander size_t fromsize __unused, 45933790cc1SJens Wiklander struct bignum *to __unused) 46033790cc1SJens Wiklander { 46133790cc1SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 46233790cc1SJens Wiklander } 46333790cc1SJens Wiklander 46433790cc1SJens Wiklander size_t crypto_bignum_num_bytes(struct bignum *a __unused) 46533790cc1SJens Wiklander { 46633790cc1SJens Wiklander return 0; 46733790cc1SJens Wiklander } 46833790cc1SJens Wiklander 46933790cc1SJens Wiklander size_t crypto_bignum_num_bits(struct bignum *a __unused) 47033790cc1SJens Wiklander { 47133790cc1SJens Wiklander return 0; 47233790cc1SJens Wiklander } 47333790cc1SJens Wiklander 47433790cc1SJens Wiklander /* 47533790cc1SJens Wiklander * crypto_bignum_allocate() and crypto_bignum_bin2bn() failing should be 47633790cc1SJens Wiklander * enough to guarantee that the functions calling this function aren't 47733790cc1SJens Wiklander * called, but just in case add a panic() here to avoid unexpected 47833790cc1SJens Wiklander * behavoir. 47933790cc1SJens Wiklander */ 48033790cc1SJens Wiklander static void bignum_cant_happen(void) 48133790cc1SJens Wiklander { 48233790cc1SJens Wiklander volatile bool b = true; 48333790cc1SJens Wiklander 48433790cc1SJens Wiklander /* Avoid warning about function does not return */ 48533790cc1SJens Wiklander if (b) 48633790cc1SJens Wiklander panic(); 48733790cc1SJens Wiklander } 48833790cc1SJens Wiklander 48933790cc1SJens Wiklander void crypto_bignum_bn2bin(const struct bignum *from __unused, 49033790cc1SJens Wiklander uint8_t *to __unused) 49133790cc1SJens Wiklander { 49233790cc1SJens Wiklander bignum_cant_happen(); 49333790cc1SJens Wiklander } 49433790cc1SJens Wiklander 49533790cc1SJens Wiklander void crypto_bignum_copy(struct bignum *to __unused, 49633790cc1SJens Wiklander const struct bignum *from __unused) 49733790cc1SJens Wiklander { 49833790cc1SJens Wiklander bignum_cant_happen(); 49933790cc1SJens Wiklander } 50033790cc1SJens Wiklander 50133790cc1SJens Wiklander void crypto_bignum_free(struct bignum *a) 50233790cc1SJens Wiklander { 50333790cc1SJens Wiklander if (a) 50433790cc1SJens Wiklander panic(); 50533790cc1SJens Wiklander } 50633790cc1SJens Wiklander 50733790cc1SJens Wiklander void crypto_bignum_clear(struct bignum *a __unused) 50833790cc1SJens Wiklander { 50933790cc1SJens Wiklander bignum_cant_happen(); 51033790cc1SJens Wiklander } 51133790cc1SJens Wiklander 51233790cc1SJens Wiklander /* return -1 if a<b, 0 if a==b, +1 if a>b */ 51333790cc1SJens Wiklander int32_t crypto_bignum_compare(struct bignum *a __unused, 51433790cc1SJens Wiklander struct bignum *b __unused) 51533790cc1SJens Wiklander { 51633790cc1SJens Wiklander bignum_cant_happen(); 51733790cc1SJens Wiklander return -1; 51833790cc1SJens Wiklander } 519da1de557SJens Wiklander #endif 520291e5450SJens Wiklander 521da1de557SJens Wiklander #if !defined(CFG_CRYPTO_RSA) 522291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_rsa_keypair(struct rsa_keypair *s __unused, 523291e5450SJens Wiklander size_t key_size_bits __unused) 524291e5450SJens Wiklander { 525291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 526291e5450SJens Wiklander } 527291e5450SJens Wiklander 528291e5450SJens Wiklander TEE_Result 529291e5450SJens Wiklander crypto_acipher_alloc_rsa_public_key(struct rsa_public_key *s __unused, 530291e5450SJens Wiklander size_t key_size_bits __unused) 531291e5450SJens Wiklander { 532291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 533291e5450SJens Wiklander } 534291e5450SJens Wiklander 535291e5450SJens Wiklander void crypto_acipher_free_rsa_public_key(struct rsa_public_key *s __unused) 536291e5450SJens Wiklander { 537291e5450SJens Wiklander } 538291e5450SJens Wiklander 539a1d5c81fSElias von Däniken void crypto_acipher_free_rsa_keypair(struct rsa_keypair *s __unused) 540a1d5c81fSElias von Däniken { 541a1d5c81fSElias von Däniken } 542a1d5c81fSElias von Däniken 543291e5450SJens Wiklander TEE_Result crypto_acipher_gen_rsa_key(struct rsa_keypair *key __unused, 544291e5450SJens Wiklander size_t key_size __unused) 545291e5450SJens Wiklander { 546291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 547291e5450SJens Wiklander } 548291e5450SJens Wiklander 549291e5450SJens Wiklander TEE_Result crypto_acipher_rsanopad_decrypt(struct rsa_keypair *key __unused, 550291e5450SJens Wiklander const uint8_t *src __unused, 551291e5450SJens Wiklander size_t src_len __unused, 552291e5450SJens Wiklander uint8_t *dst __unused, 553291e5450SJens Wiklander size_t *dst_len __unused) 554291e5450SJens Wiklander { 555291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 556291e5450SJens Wiklander } 557291e5450SJens Wiklander 558291e5450SJens Wiklander TEE_Result crypto_acipher_rsanopad_encrypt(struct rsa_public_key *key __unused, 559291e5450SJens Wiklander const uint8_t *src __unused, 560291e5450SJens Wiklander size_t src_len __unused, 561291e5450SJens Wiklander uint8_t *dst __unused, 562291e5450SJens Wiklander size_t *dst_len __unused) 563291e5450SJens Wiklander { 564291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 565291e5450SJens Wiklander } 566291e5450SJens Wiklander 567291e5450SJens Wiklander TEE_Result crypto_acipher_rsaes_decrypt(uint32_t algo __unused, 568291e5450SJens Wiklander struct rsa_keypair *key __unused, 569291e5450SJens Wiklander const uint8_t *label __unused, 570291e5450SJens Wiklander size_t label_len __unused, 571291e5450SJens Wiklander const uint8_t *src __unused, 572291e5450SJens Wiklander size_t src_len __unused, 573291e5450SJens Wiklander uint8_t *dst __unused, 574291e5450SJens Wiklander size_t *dst_len __unused) 575291e5450SJens Wiklander { 576291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 577291e5450SJens Wiklander } 578291e5450SJens Wiklander 579291e5450SJens Wiklander TEE_Result crypto_acipher_rsaes_encrypt(uint32_t algo __unused, 580291e5450SJens Wiklander struct rsa_public_key *key __unused, 581291e5450SJens Wiklander const uint8_t *label __unused, 582291e5450SJens Wiklander size_t label_len __unused, 583291e5450SJens Wiklander const uint8_t *src __unused, 584291e5450SJens Wiklander size_t src_len __unused, 585291e5450SJens Wiklander uint8_t *dst __unused, 586291e5450SJens Wiklander size_t *dst_len __unused) 587291e5450SJens Wiklander { 588291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 589291e5450SJens Wiklander } 590291e5450SJens Wiklander 591291e5450SJens Wiklander TEE_Result crypto_acipher_rsassa_sign(uint32_t algo __unused, 592291e5450SJens Wiklander struct rsa_keypair *key __unused, 593291e5450SJens Wiklander int salt_len __unused, 594291e5450SJens Wiklander const uint8_t *msg __unused, 595291e5450SJens Wiklander size_t msg_len __unused, 596291e5450SJens Wiklander uint8_t *sig __unused, 597291e5450SJens Wiklander size_t *sig_len __unused) 598291e5450SJens Wiklander { 599291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 600291e5450SJens Wiklander } 601291e5450SJens Wiklander 602291e5450SJens Wiklander TEE_Result crypto_acipher_rsassa_verify(uint32_t algo __unused, 603291e5450SJens Wiklander struct rsa_public_key *key __unused, 604291e5450SJens Wiklander int salt_len __unused, 605291e5450SJens Wiklander const uint8_t *msg __unused, 606291e5450SJens Wiklander size_t msg_len __unused, 607291e5450SJens Wiklander const uint8_t *sig __unused, 608291e5450SJens Wiklander size_t sig_len __unused) 609291e5450SJens Wiklander { 610291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 611291e5450SJens Wiklander } 612da1de557SJens Wiklander #endif /*!CFG_CRYPTO_RSA*/ 613291e5450SJens Wiklander 614da1de557SJens Wiklander #if !defined(CFG_CRYPTO_DSA) 615291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_dsa_keypair(struct dsa_keypair *s __unused, 616291e5450SJens Wiklander size_t key_size_bits __unused) 617291e5450SJens Wiklander { 618291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 619291e5450SJens Wiklander } 620291e5450SJens Wiklander 621291e5450SJens Wiklander TEE_Result 622291e5450SJens Wiklander crypto_acipher_alloc_dsa_public_key(struct dsa_public_key *s __unused, 623291e5450SJens Wiklander size_t key_size_bits __unused) 624291e5450SJens Wiklander { 625291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 626291e5450SJens Wiklander } 627291e5450SJens Wiklander 628291e5450SJens Wiklander TEE_Result crypto_acipher_gen_dsa_key(struct dsa_keypair *key __unused, 629291e5450SJens Wiklander size_t key_size __unused) 630291e5450SJens Wiklander { 631291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 632291e5450SJens Wiklander } 633291e5450SJens Wiklander 634291e5450SJens Wiklander TEE_Result crypto_acipher_dsa_sign(uint32_t algo __unused, 635291e5450SJens Wiklander struct dsa_keypair *key __unused, 636291e5450SJens Wiklander const uint8_t *msg __unused, 637291e5450SJens Wiklander size_t msg_len __unused, 638291e5450SJens Wiklander uint8_t *sig __unused, 639291e5450SJens Wiklander size_t *sig_len __unused) 640291e5450SJens Wiklander { 641291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 642291e5450SJens Wiklander } 643291e5450SJens Wiklander 644291e5450SJens Wiklander TEE_Result crypto_acipher_dsa_verify(uint32_t algo __unused, 645291e5450SJens Wiklander struct dsa_public_key *key __unused, 646291e5450SJens Wiklander const uint8_t *msg __unused, 647291e5450SJens Wiklander size_t msg_len __unused, 648291e5450SJens Wiklander const uint8_t *sig __unused, 649291e5450SJens Wiklander size_t sig_len __unused) 650291e5450SJens Wiklander { 651291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 652291e5450SJens Wiklander } 653da1de557SJens Wiklander #endif /*!CFG_CRYPTO_DSA*/ 654291e5450SJens Wiklander 655da1de557SJens Wiklander #if !defined(CFG_CRYPTO_DH) 656291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_dh_keypair(struct dh_keypair *s __unused, 657291e5450SJens Wiklander size_t key_size_bits __unused) 658291e5450SJens Wiklander { 659291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 660291e5450SJens Wiklander } 661291e5450SJens Wiklander 662291e5450SJens Wiklander TEE_Result crypto_acipher_gen_dh_key(struct dh_keypair *key __unused, 663291e5450SJens Wiklander struct bignum *q __unused, 6649f4dcefbSJerome Forissier size_t xbits __unused, 6659f4dcefbSJerome Forissier size_t key_size __unused) 666291e5450SJens Wiklander { 667291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 668291e5450SJens Wiklander } 669291e5450SJens Wiklander 670291e5450SJens Wiklander TEE_Result 671291e5450SJens Wiklander crypto_acipher_dh_shared_secret(struct dh_keypair *private_key __unused, 672291e5450SJens Wiklander struct bignum *public_key __unused, 673291e5450SJens Wiklander struct bignum *secret __unused) 674291e5450SJens Wiklander { 675291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 676291e5450SJens Wiklander } 677da1de557SJens Wiklander #endif /*!CFG_CRYPTO_DH*/ 678291e5450SJens Wiklander 679df00cf59SCedric Neveux TEE_Result crypto_acipher_alloc_ecc_public_key(struct ecc_public_key *key, 680df00cf59SCedric Neveux uint32_t key_type, 681df00cf59SCedric Neveux size_t key_size_bits) 682291e5450SJens Wiklander { 683df00cf59SCedric Neveux TEE_Result res = TEE_ERROR_NOT_IMPLEMENTED; 684df00cf59SCedric Neveux 685df00cf59SCedric Neveux /* 686df00cf59SCedric Neveux * Use default cryptographic implementation if no matching 687df00cf59SCedric Neveux * drvcrypt device. 688df00cf59SCedric Neveux */ 689df00cf59SCedric Neveux res = drvcrypt_asym_alloc_ecc_public_key(key, key_type, key_size_bits); 690df00cf59SCedric Neveux if (res == TEE_ERROR_NOT_IMPLEMENTED) 691df00cf59SCedric Neveux res = crypto_asym_alloc_ecc_public_key(key, key_type, 692df00cf59SCedric Neveux key_size_bits); 693df00cf59SCedric Neveux 694df00cf59SCedric Neveux return res; 695291e5450SJens Wiklander } 696291e5450SJens Wiklander 697df00cf59SCedric Neveux TEE_Result crypto_acipher_alloc_ecc_keypair(struct ecc_keypair *key, 698df00cf59SCedric Neveux uint32_t key_type, 699df00cf59SCedric Neveux size_t key_size_bits) 700291e5450SJens Wiklander { 701df00cf59SCedric Neveux TEE_Result res = TEE_ERROR_NOT_IMPLEMENTED; 702df00cf59SCedric Neveux 703df00cf59SCedric Neveux /* 704df00cf59SCedric Neveux * Use default cryptographic implementation if no matching 705df00cf59SCedric Neveux * drvcrypt device. 706df00cf59SCedric Neveux */ 707df00cf59SCedric Neveux res = drvcrypt_asym_alloc_ecc_keypair(key, key_type, key_size_bits); 708df00cf59SCedric Neveux if (res == TEE_ERROR_NOT_IMPLEMENTED) 709df00cf59SCedric Neveux res = crypto_asym_alloc_ecc_keypair(key, key_type, 710df00cf59SCedric Neveux key_size_bits); 711df00cf59SCedric Neveux 712df00cf59SCedric Neveux return res; 713291e5450SJens Wiklander } 714291e5450SJens Wiklander 715df00cf59SCedric Neveux void crypto_acipher_free_ecc_public_key(struct ecc_public_key *key) 716291e5450SJens Wiklander { 717df00cf59SCedric Neveux assert(key->ops && key->ops->free); 718df00cf59SCedric Neveux 719df00cf59SCedric Neveux key->ops->free(key); 720291e5450SJens Wiklander } 721291e5450SJens Wiklander 722df00cf59SCedric Neveux TEE_Result crypto_acipher_gen_ecc_key(struct ecc_keypair *key, 723df00cf59SCedric Neveux size_t key_size_bits) 724291e5450SJens Wiklander { 725df00cf59SCedric Neveux assert(key->ops && key->ops->generate); 726df00cf59SCedric Neveux 727df00cf59SCedric Neveux return key->ops->generate(key, key_size_bits); 728291e5450SJens Wiklander } 729291e5450SJens Wiklander 730df00cf59SCedric Neveux TEE_Result crypto_acipher_ecc_sign(uint32_t algo, struct ecc_keypair *key, 731df00cf59SCedric Neveux const uint8_t *msg, size_t msg_len, 732df00cf59SCedric Neveux uint8_t *sig, size_t *sig_len) 733291e5450SJens Wiklander { 734df00cf59SCedric Neveux assert(key->ops); 735df00cf59SCedric Neveux 736df00cf59SCedric Neveux if (!key->ops->sign) 737291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 738df00cf59SCedric Neveux 739df00cf59SCedric Neveux return key->ops->sign(algo, key, msg, msg_len, sig, sig_len); 740291e5450SJens Wiklander } 741291e5450SJens Wiklander 742df00cf59SCedric Neveux TEE_Result crypto_acipher_ecc_verify(uint32_t algo, struct ecc_public_key *key, 743df00cf59SCedric Neveux const uint8_t *msg, size_t msg_len, 744df00cf59SCedric Neveux const uint8_t *sig, size_t sig_len) 745291e5450SJens Wiklander { 746df00cf59SCedric Neveux assert(key->ops); 747df00cf59SCedric Neveux 748df00cf59SCedric Neveux if (!key->ops->verify) 749291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 750df00cf59SCedric Neveux 751df00cf59SCedric Neveux return key->ops->verify(algo, key, msg, msg_len, sig, sig_len); 752291e5450SJens Wiklander } 753291e5450SJens Wiklander 754df00cf59SCedric Neveux TEE_Result crypto_acipher_ecc_shared_secret(struct ecc_keypair *private_key, 755df00cf59SCedric Neveux struct ecc_public_key *public_key, 756df00cf59SCedric Neveux void *secret, 757df00cf59SCedric Neveux unsigned long *secret_len) 758291e5450SJens Wiklander { 759df00cf59SCedric Neveux assert(private_key->ops); 760df00cf59SCedric Neveux 761df00cf59SCedric Neveux if (!private_key->ops->shared_secret) 762291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 763df00cf59SCedric Neveux 764df00cf59SCedric Neveux return private_key->ops->shared_secret(private_key, public_key, secret, 765df00cf59SCedric Neveux secret_len); 766291e5450SJens Wiklander } 76791fc6bd8SJerome Forissier 768884fd190SCedric Neveux TEE_Result crypto_acipher_sm2_pke_decrypt(struct ecc_keypair *key, 769884fd190SCedric Neveux const uint8_t *src, size_t src_len, 770884fd190SCedric Neveux uint8_t *dst, size_t *dst_len) 77191fc6bd8SJerome Forissier { 772884fd190SCedric Neveux assert(key->ops); 773884fd190SCedric Neveux 774884fd190SCedric Neveux if (!key->ops->decrypt) 77591fc6bd8SJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED; 776884fd190SCedric Neveux 777884fd190SCedric Neveux return key->ops->decrypt(key, src, src_len, dst, dst_len); 77891fc6bd8SJerome Forissier } 77991fc6bd8SJerome Forissier 780884fd190SCedric Neveux TEE_Result crypto_acipher_sm2_pke_encrypt(struct ecc_public_key *key, 781884fd190SCedric Neveux const uint8_t *src, size_t src_len, 782884fd190SCedric Neveux uint8_t *dst, size_t *dst_len) 78391fc6bd8SJerome Forissier { 784884fd190SCedric Neveux assert(key->ops); 785884fd190SCedric Neveux 786884fd190SCedric Neveux if (!key->ops->encrypt) 78791fc6bd8SJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED; 788884fd190SCedric Neveux 789884fd190SCedric Neveux return key->ops->encrypt(key, src, src_len, dst, dst_len); 79091fc6bd8SJerome Forissier } 7910f151943SJerome Forissier 7925b385b3fSJerome Forissier #if !defined(CFG_CRYPTO_SM2_KEP) 7935b385b3fSJerome Forissier TEE_Result crypto_acipher_sm2_kep_derive(struct ecc_keypair *my_key __unused, 7945b385b3fSJerome Forissier struct ecc_keypair *my_eph_key 7955b385b3fSJerome Forissier __unused, 7965b385b3fSJerome Forissier struct ecc_public_key *peer_key 7975b385b3fSJerome Forissier __unused, 7985b385b3fSJerome Forissier struct ecc_public_key *peer_eph_key 7995b385b3fSJerome Forissier __unused, 8005b385b3fSJerome Forissier struct sm2_kep_parms *p __unused) 8015b385b3fSJerome Forissier { 8025b385b3fSJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED; 8035b385b3fSJerome Forissier } 8045b385b3fSJerome Forissier #endif 8055dfe86d0SJorge Ramirez-Ortiz 80690040fa4SSohaib ul Hassan #if !defined(CFG_CRYPTO_X25519) 80790040fa4SSohaib ul Hassan TEE_Result crypto_acipher_alloc_x25519_keypair(struct x25519_keypair *key 80890040fa4SSohaib ul Hassan __unused, 80990040fa4SSohaib ul Hassan size_t key_size_bits __unused) 81090040fa4SSohaib ul Hassan { 81190040fa4SSohaib ul Hassan return TEE_ERROR_NOT_IMPLEMENTED; 81290040fa4SSohaib ul Hassan } 81390040fa4SSohaib ul Hassan 81490040fa4SSohaib ul Hassan TEE_Result crypto_acipher_gen_x25519_key(struct x25519_keypair *key __unused, 81590040fa4SSohaib ul Hassan size_t key_size __unused) 81690040fa4SSohaib ul Hassan { 81790040fa4SSohaib ul Hassan return TEE_ERROR_NOT_IMPLEMENTED; 81890040fa4SSohaib ul Hassan } 81990040fa4SSohaib ul Hassan 82090040fa4SSohaib ul Hassan TEE_Result crypto_acipher_x25519_shared_secret(struct x25519_keypair 82190040fa4SSohaib ul Hassan *private_key __unused, 82290040fa4SSohaib ul Hassan void *public_key __unused, 82390040fa4SSohaib ul Hassan void *secret __unused, 82490040fa4SSohaib ul Hassan unsigned long 82590040fa4SSohaib ul Hassan *secret_len __unused) 82690040fa4SSohaib ul Hassan { 82790040fa4SSohaib ul Hassan return TEE_ERROR_NOT_IMPLEMENTED; 82890040fa4SSohaib ul Hassan } 82990040fa4SSohaib ul Hassan #endif 83090040fa4SSohaib ul Hassan 831a116848bSValerii Chubar #if !defined(CFG_CRYPTO_ED25519) 832a116848bSValerii Chubar TEE_Result crypto_acipher_alloc_ed25519_keypair(struct ed25519_keypair *key 833a116848bSValerii Chubar __unused, 834a116848bSValerii Chubar size_t key_size_bits __unused) 835a116848bSValerii Chubar { 836a116848bSValerii Chubar return TEE_ERROR_NOT_IMPLEMENTED; 837a116848bSValerii Chubar } 838a116848bSValerii Chubar 839a116848bSValerii Chubar TEE_Result crypto_acipher_gen_ed25519_key(struct ed25519_keypair *key __unused, 840a116848bSValerii Chubar size_t key_size __unused) 841a116848bSValerii Chubar { 842a116848bSValerii Chubar return TEE_ERROR_NOT_IMPLEMENTED; 843a116848bSValerii Chubar } 844a116848bSValerii Chubar 845a116848bSValerii Chubar TEE_Result crypto_acipher_ed25519_sign(struct ed25519_keypair *key __unused, 846a116848bSValerii Chubar const uint8_t *msg __unused, 847a116848bSValerii Chubar size_t msg_len __unused, 848a116848bSValerii Chubar uint8_t *sig __unused, 849a116848bSValerii Chubar size_t *sig_len __unused) 850a116848bSValerii Chubar { 851a116848bSValerii Chubar return TEE_ERROR_NOT_IMPLEMENTED; 852a116848bSValerii Chubar } 853a116848bSValerii Chubar 854a116848bSValerii Chubar TEE_Result crypto_acipher_ed25519_verify(struct ed25519_keypair *key __unused, 855a116848bSValerii Chubar const uint8_t *msg __unused, 856a116848bSValerii Chubar size_t msg_len __unused, 857a116848bSValerii Chubar const uint8_t *sig __unused, 858a116848bSValerii Chubar size_t sig_len __unused) 859a116848bSValerii Chubar { 860a116848bSValerii Chubar return TEE_ERROR_NOT_IMPLEMENTED; 861a116848bSValerii Chubar } 862a116848bSValerii Chubar 863a116848bSValerii Chubar TEE_Result crypto_acipher_ed25519ctx_sign(struct ed25519_keypair *key __unused, 864a116848bSValerii Chubar const uint8_t *msg __unused, 865a116848bSValerii Chubar size_t msg_len __unused, 866a116848bSValerii Chubar uint8_t *sig __unused, 867a116848bSValerii Chubar size_t *sig_len __unused, 868a116848bSValerii Chubar bool ph_flag __unused, 869a116848bSValerii Chubar const uint8_t *ctx __unused, 870a116848bSValerii Chubar size_t ctxlen __unused) 871a116848bSValerii Chubar { 872a116848bSValerii Chubar return TEE_ERROR_NOT_IMPLEMENTED; 873a116848bSValerii Chubar } 874a116848bSValerii Chubar 875a116848bSValerii Chubar TEE_Result crypto_acipher_ed25519ctx_verify(struct ed25519_keypair *key 876a116848bSValerii Chubar __unused, 877a116848bSValerii Chubar const uint8_t *msg __unused, 878a116848bSValerii Chubar size_t msg_len __unused, 879a116848bSValerii Chubar const uint8_t *sig __unused, 880a116848bSValerii Chubar size_t sig_len __unused, 881a116848bSValerii Chubar bool ph_flag __unused, 882a116848bSValerii Chubar const uint8_t *ctx __unused, 883a116848bSValerii Chubar size_t ctxlen __unused) 884a116848bSValerii Chubar { 885a116848bSValerii Chubar return TEE_ERROR_NOT_IMPLEMENTED; 886a116848bSValerii Chubar } 887a116848bSValerii Chubar #endif 888a116848bSValerii Chubar 8896301ca1cSJorge Ramirez-Ortiz __weak TEE_Result crypto_storage_obj_del(struct tee_obj *obj __unused) 8905dfe86d0SJorge Ramirez-Ortiz { 8916301ca1cSJorge Ramirez-Ortiz return TEE_ERROR_NOT_IMPLEMENTED; 8925dfe86d0SJorge Ramirez-Ortiz } 893