1fb7ef469SJerome Forissier // SPDX-License-Identifier: BSD-2-Clause 2b887bd8fSJens Wiklander /* 3b887bd8fSJens Wiklander * Copyright (c) 2017, Linaro Limited 4b887bd8fSJens Wiklander */ 5b887bd8fSJens Wiklander 6d7ac7d0fSJens Wiklander #include <assert.h> 7b887bd8fSJens Wiklander #include <compiler.h> 8e1770e71SJens Wiklander #include <crypto/crypto.h> 96648f482SJens Wiklander #include <crypto/crypto_impl.h> 1033790cc1SJens Wiklander #include <kernel/panic.h> 11d7ac7d0fSJens Wiklander #include <stdlib.h> 12d7ac7d0fSJens Wiklander #include <string.h> 136d259e05SJens Wiklander #include <utee_defines.h> 14b887bd8fSJens Wiklander 156648f482SJens Wiklander TEE_Result crypto_hash_alloc_ctx(void **ctx, uint32_t algo) 16b887bd8fSJens Wiklander { 177222fc6aSCedric Neveux TEE_Result res = TEE_ERROR_NOT_IMPLEMENTED; 186648f482SJens Wiklander struct crypto_hash_ctx *c = NULL; 196648f482SJens Wiklander 207222fc6aSCedric Neveux /* 217222fc6aSCedric Neveux * Use default cryptographic implement if no matching 227222fc6aSCedric Neveux * drvcrypt device. 237222fc6aSCedric Neveux */ 247222fc6aSCedric Neveux res = drvcrypt_hash_alloc_ctx(&c, algo); 257222fc6aSCedric Neveux 267222fc6aSCedric Neveux if (res == TEE_ERROR_NOT_IMPLEMENTED) { 276648f482SJens Wiklander switch (algo) { 286648f482SJens Wiklander case TEE_ALG_MD5: 296648f482SJens Wiklander res = crypto_md5_alloc_ctx(&c); 306648f482SJens Wiklander break; 316648f482SJens Wiklander case TEE_ALG_SHA1: 326648f482SJens Wiklander res = crypto_sha1_alloc_ctx(&c); 336648f482SJens Wiklander break; 346648f482SJens Wiklander case TEE_ALG_SHA224: 356648f482SJens Wiklander res = crypto_sha224_alloc_ctx(&c); 366648f482SJens Wiklander break; 376648f482SJens Wiklander case TEE_ALG_SHA256: 386648f482SJens Wiklander res = crypto_sha256_alloc_ctx(&c); 396648f482SJens Wiklander break; 406648f482SJens Wiklander case TEE_ALG_SHA384: 416648f482SJens Wiklander res = crypto_sha384_alloc_ctx(&c); 426648f482SJens Wiklander break; 436648f482SJens Wiklander case TEE_ALG_SHA512: 446648f482SJens Wiklander res = crypto_sha512_alloc_ctx(&c); 456648f482SJens Wiklander break; 4647645577SJerome Forissier case TEE_ALG_SM3: 4747645577SJerome Forissier res = crypto_sm3_alloc_ctx(&c); 4847645577SJerome Forissier break; 496648f482SJens Wiklander default: 507222fc6aSCedric Neveux break; 517222fc6aSCedric Neveux } 52b887bd8fSJens Wiklander } 53b887bd8fSJens Wiklander 546648f482SJens Wiklander if (!res) 556648f482SJens Wiklander *ctx = c; 566648f482SJens Wiklander 576648f482SJens Wiklander return res; 586648f482SJens Wiklander } 596648f482SJens Wiklander 606648f482SJens Wiklander static const struct crypto_hash_ops *hash_ops(void *ctx) 616648f482SJens Wiklander { 626648f482SJens Wiklander struct crypto_hash_ctx *c = ctx; 636648f482SJens Wiklander 646648f482SJens Wiklander assert(c && c->ops); 656648f482SJens Wiklander 666648f482SJens Wiklander return c->ops; 676648f482SJens Wiklander } 686648f482SJens Wiklander 696b3a371cSJens Wiklander void crypto_hash_free_ctx(void *ctx) 70ecf2e014SJens Wiklander { 71ce7a47f5SJerome Forissier if (ctx) 726648f482SJens Wiklander hash_ops(ctx)->free_ctx(ctx); 73ecf2e014SJens Wiklander } 74ecf2e014SJens Wiklander 756b3a371cSJens Wiklander void crypto_hash_copy_state(void *dst_ctx, void *src_ctx) 76ecf2e014SJens Wiklander { 776648f482SJens Wiklander hash_ops(dst_ctx)->copy_state(dst_ctx, src_ctx); 78ecf2e014SJens Wiklander } 79ecf2e014SJens Wiklander 806b3a371cSJens Wiklander TEE_Result crypto_hash_init(void *ctx) 81b887bd8fSJens Wiklander { 826648f482SJens Wiklander return hash_ops(ctx)->init(ctx); 83b887bd8fSJens Wiklander } 846648f482SJens Wiklander 856b3a371cSJens Wiklander TEE_Result crypto_hash_update(void *ctx, const uint8_t *data, size_t len) 86b887bd8fSJens Wiklander { 876648f482SJens Wiklander return hash_ops(ctx)->update(ctx, data, len); 88b887bd8fSJens Wiklander } 896648f482SJens Wiklander 906b3a371cSJens Wiklander TEE_Result crypto_hash_final(void *ctx, uint8_t *digest, size_t len) 91b887bd8fSJens Wiklander { 926648f482SJens Wiklander return hash_ops(ctx)->final(ctx, digest, len); 93b887bd8fSJens Wiklander } 9482d91db1SJens Wiklander 9596098f01SJens Wiklander TEE_Result crypto_cipher_alloc_ctx(void **ctx, uint32_t algo) 9682d91db1SJens Wiklander { 9796098f01SJens Wiklander TEE_Result res = TEE_SUCCESS; 9896098f01SJens Wiklander struct crypto_cipher_ctx *c = NULL; 9996098f01SJens Wiklander 10096098f01SJens Wiklander switch (algo) { 10196098f01SJens Wiklander case TEE_ALG_AES_ECB_NOPAD: 10296098f01SJens Wiklander res = crypto_aes_ecb_alloc_ctx(&c); 10396098f01SJens Wiklander break; 10496098f01SJens Wiklander case TEE_ALG_AES_CBC_NOPAD: 10596098f01SJens Wiklander res = crypto_aes_cbc_alloc_ctx(&c); 10696098f01SJens Wiklander break; 10796098f01SJens Wiklander case TEE_ALG_AES_CTR: 10896098f01SJens Wiklander res = crypto_aes_ctr_alloc_ctx(&c); 10996098f01SJens Wiklander break; 11096098f01SJens Wiklander case TEE_ALG_AES_CTS: 11196098f01SJens Wiklander res = crypto_aes_cts_alloc_ctx(&c); 11296098f01SJens Wiklander break; 11396098f01SJens Wiklander case TEE_ALG_AES_XTS: 11496098f01SJens Wiklander res = crypto_aes_xts_alloc_ctx(&c); 11596098f01SJens Wiklander break; 11696098f01SJens Wiklander case TEE_ALG_DES_ECB_NOPAD: 11796098f01SJens Wiklander res = crypto_des_ecb_alloc_ctx(&c); 11896098f01SJens Wiklander break; 11996098f01SJens Wiklander case TEE_ALG_DES3_ECB_NOPAD: 12096098f01SJens Wiklander res = crypto_des3_ecb_alloc_ctx(&c); 12196098f01SJens Wiklander break; 12296098f01SJens Wiklander case TEE_ALG_DES_CBC_NOPAD: 12396098f01SJens Wiklander res = crypto_des_cbc_alloc_ctx(&c); 12496098f01SJens Wiklander break; 12596098f01SJens Wiklander case TEE_ALG_DES3_CBC_NOPAD: 12696098f01SJens Wiklander res = crypto_des3_cbc_alloc_ctx(&c); 12796098f01SJens Wiklander break; 128ade6f848SJerome Forissier case TEE_ALG_SM4_ECB_NOPAD: 129ade6f848SJerome Forissier res = crypto_sm4_ecb_alloc_ctx(&c); 130ade6f848SJerome Forissier break; 131ade6f848SJerome Forissier case TEE_ALG_SM4_CBC_NOPAD: 132ade6f848SJerome Forissier res = crypto_sm4_cbc_alloc_ctx(&c); 133ade6f848SJerome Forissier break; 134ade6f848SJerome Forissier case TEE_ALG_SM4_CTR: 135ade6f848SJerome Forissier res = crypto_sm4_ctr_alloc_ctx(&c); 136ade6f848SJerome Forissier break; 13796098f01SJens Wiklander default: 1381c5fdd1fSJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED; 13982d91db1SJens Wiklander } 14082d91db1SJens Wiklander 14196098f01SJens Wiklander if (!res) 14296098f01SJens Wiklander *ctx = c; 14396098f01SJens Wiklander 14496098f01SJens Wiklander return res; 14596098f01SJens Wiklander } 14696098f01SJens Wiklander 14796098f01SJens Wiklander static const struct crypto_cipher_ops *cipher_ops(void *ctx) 14896098f01SJens Wiklander { 14996098f01SJens Wiklander struct crypto_cipher_ctx *c = ctx; 15096098f01SJens Wiklander 15196098f01SJens Wiklander assert(c && c->ops); 15296098f01SJens Wiklander 15396098f01SJens Wiklander return c->ops; 15496098f01SJens Wiklander } 15596098f01SJens Wiklander 156cbda7091SJens Wiklander void crypto_cipher_free_ctx(void *ctx) 15772a9b1a0SJens Wiklander { 158ce7a47f5SJerome Forissier if (ctx) 15996098f01SJens Wiklander cipher_ops(ctx)->free_ctx(ctx); 16072a9b1a0SJens Wiklander } 16172a9b1a0SJens Wiklander 162cbda7091SJens Wiklander void crypto_cipher_copy_state(void *dst_ctx, void *src_ctx) 16372a9b1a0SJens Wiklander { 16496098f01SJens Wiklander cipher_ops(dst_ctx)->copy_state(dst_ctx, src_ctx); 16572a9b1a0SJens Wiklander } 16672a9b1a0SJens Wiklander 167cbda7091SJens Wiklander TEE_Result crypto_cipher_init(void *ctx, TEE_OperationMode mode, 168cbda7091SJens Wiklander const uint8_t *key1, size_t key1_len, 169cbda7091SJens Wiklander const uint8_t *key2, size_t key2_len, 170cbda7091SJens Wiklander const uint8_t *iv, size_t iv_len) 17182d91db1SJens Wiklander { 17296098f01SJens Wiklander if (mode != TEE_MODE_DECRYPT && mode != TEE_MODE_ENCRYPT) 17396098f01SJens Wiklander return TEE_ERROR_BAD_PARAMETERS; 17496098f01SJens Wiklander 17596098f01SJens Wiklander return cipher_ops(ctx)->init(ctx, mode, key1, key1_len, key2, key2_len, 17696098f01SJens Wiklander iv, iv_len); 17782d91db1SJens Wiklander } 17882d91db1SJens Wiklander 179cbda7091SJens Wiklander TEE_Result crypto_cipher_update(void *ctx, TEE_OperationMode mode __unused, 18096098f01SJens Wiklander bool last_block, const uint8_t *data, 18196098f01SJens Wiklander size_t len, uint8_t *dst) 18282d91db1SJens Wiklander { 18396098f01SJens Wiklander return cipher_ops(ctx)->update(ctx, last_block, data, len, dst); 18482d91db1SJens Wiklander } 18582d91db1SJens Wiklander 186cbda7091SJens Wiklander void crypto_cipher_final(void *ctx) 18782d91db1SJens Wiklander { 18896098f01SJens Wiklander cipher_ops(ctx)->final(ctx); 18982d91db1SJens Wiklander } 190e9eaba5cSJens Wiklander 1916d259e05SJens Wiklander TEE_Result crypto_cipher_get_block_size(uint32_t algo, size_t *size) 1926d259e05SJens Wiklander { 1936d259e05SJens Wiklander uint32_t class = TEE_ALG_GET_CLASS(algo); 1946d259e05SJens Wiklander 1956d259e05SJens Wiklander if (class != TEE_OPERATION_CIPHER && class != TEE_OPERATION_MAC && 1966d259e05SJens Wiklander class != TEE_OPERATION_AE) 1976d259e05SJens Wiklander return TEE_ERROR_BAD_PARAMETERS; 1986d259e05SJens Wiklander 1996d259e05SJens Wiklander switch (TEE_ALG_GET_MAIN_ALG(algo)) { 2006d259e05SJens Wiklander case TEE_MAIN_ALGO_AES: 2016d259e05SJens Wiklander *size = TEE_AES_BLOCK_SIZE; 2026d259e05SJens Wiklander return TEE_SUCCESS; 2036d259e05SJens Wiklander case TEE_MAIN_ALGO_DES: 2046d259e05SJens Wiklander case TEE_MAIN_ALGO_DES3: 2056d259e05SJens Wiklander *size = TEE_DES_BLOCK_SIZE; 2066d259e05SJens Wiklander return TEE_SUCCESS; 207ade6f848SJerome Forissier case TEE_MAIN_ALGO_SM4: 208ade6f848SJerome Forissier *size = TEE_SM4_BLOCK_SIZE; 209ade6f848SJerome Forissier return TEE_SUCCESS; 2106d259e05SJens Wiklander default: 2116d259e05SJens Wiklander return TEE_ERROR_NOT_SUPPORTED; 2126d259e05SJens Wiklander } 2136d259e05SJens Wiklander } 2146d259e05SJens Wiklander 2155da36a24SJens Wiklander TEE_Result crypto_mac_alloc_ctx(void **ctx, uint32_t algo) 216e9eaba5cSJens Wiklander { 2175da36a24SJens Wiklander TEE_Result res = TEE_SUCCESS; 2185da36a24SJens Wiklander struct crypto_mac_ctx *c = NULL; 2195da36a24SJens Wiklander 2205da36a24SJens Wiklander switch (algo) { 2215da36a24SJens Wiklander case TEE_ALG_HMAC_MD5: 2225da36a24SJens Wiklander res = crypto_hmac_md5_alloc_ctx(&c); 2235da36a24SJens Wiklander break; 2245da36a24SJens Wiklander case TEE_ALG_HMAC_SHA1: 2255da36a24SJens Wiklander res = crypto_hmac_sha1_alloc_ctx(&c); 2265da36a24SJens Wiklander break; 2275da36a24SJens Wiklander case TEE_ALG_HMAC_SHA224: 2285da36a24SJens Wiklander res = crypto_hmac_sha224_alloc_ctx(&c); 2295da36a24SJens Wiklander break; 2305da36a24SJens Wiklander case TEE_ALG_HMAC_SHA256: 2315da36a24SJens Wiklander res = crypto_hmac_sha256_alloc_ctx(&c); 2325da36a24SJens Wiklander break; 2335da36a24SJens Wiklander case TEE_ALG_HMAC_SHA384: 2345da36a24SJens Wiklander res = crypto_hmac_sha384_alloc_ctx(&c); 2355da36a24SJens Wiklander break; 2365da36a24SJens Wiklander case TEE_ALG_HMAC_SHA512: 2375da36a24SJens Wiklander res = crypto_hmac_sha512_alloc_ctx(&c); 2385da36a24SJens Wiklander break; 23947645577SJerome Forissier case TEE_ALG_HMAC_SM3: 24047645577SJerome Forissier res = crypto_hmac_sm3_alloc_ctx(&c); 24147645577SJerome Forissier break; 2425da36a24SJens Wiklander case TEE_ALG_AES_CBC_MAC_NOPAD: 2435da36a24SJens Wiklander res = crypto_aes_cbc_mac_nopad_alloc_ctx(&c); 2445da36a24SJens Wiklander break; 2455da36a24SJens Wiklander case TEE_ALG_AES_CBC_MAC_PKCS5: 2465da36a24SJens Wiklander res = crypto_aes_cbc_mac_pkcs5_alloc_ctx(&c); 2475da36a24SJens Wiklander break; 2485da36a24SJens Wiklander case TEE_ALG_DES_CBC_MAC_NOPAD: 2495da36a24SJens Wiklander res = crypto_des_cbc_mac_nopad_alloc_ctx(&c); 2505da36a24SJens Wiklander break; 2515da36a24SJens Wiklander case TEE_ALG_DES_CBC_MAC_PKCS5: 2525da36a24SJens Wiklander res = crypto_des_cbc_mac_pkcs5_alloc_ctx(&c); 2535da36a24SJens Wiklander break; 2545da36a24SJens Wiklander case TEE_ALG_DES3_CBC_MAC_NOPAD: 2555da36a24SJens Wiklander res = crypto_des3_cbc_mac_nopad_alloc_ctx(&c); 2565da36a24SJens Wiklander break; 2575da36a24SJens Wiklander case TEE_ALG_DES3_CBC_MAC_PKCS5: 2585da36a24SJens Wiklander res = crypto_des3_cbc_mac_pkcs5_alloc_ctx(&c); 2595da36a24SJens Wiklander break; 2605da36a24SJens Wiklander case TEE_ALG_AES_CMAC: 2615da36a24SJens Wiklander res = crypto_aes_cmac_alloc_ctx(&c); 2625da36a24SJens Wiklander break; 2635da36a24SJens Wiklander default: 2645da36a24SJens Wiklander return TEE_ERROR_NOT_SUPPORTED; 2655da36a24SJens Wiklander } 2665da36a24SJens Wiklander 2675da36a24SJens Wiklander if (!res) 2685da36a24SJens Wiklander *ctx = c; 2695da36a24SJens Wiklander 2705da36a24SJens Wiklander return res; 2715da36a24SJens Wiklander } 2725da36a24SJens Wiklander 2735da36a24SJens Wiklander static const struct crypto_mac_ops *mac_ops(void *ctx) 2745da36a24SJens Wiklander { 2755da36a24SJens Wiklander struct crypto_mac_ctx *c = ctx; 2765da36a24SJens Wiklander 2775da36a24SJens Wiklander assert(c && c->ops); 2785da36a24SJens Wiklander 2795da36a24SJens Wiklander return c->ops; 280e9eaba5cSJens Wiklander } 281e9eaba5cSJens Wiklander 282c69bc615SJens Wiklander void crypto_mac_free_ctx(void *ctx) 28382ef73bcSJens Wiklander { 284ce7a47f5SJerome Forissier if (ctx) 2855da36a24SJens Wiklander mac_ops(ctx)->free_ctx(ctx); 28682ef73bcSJens Wiklander } 28782ef73bcSJens Wiklander 288c69bc615SJens Wiklander void crypto_mac_copy_state(void *dst_ctx, void *src_ctx) 28982ef73bcSJens Wiklander { 2905da36a24SJens Wiklander mac_ops(dst_ctx)->copy_state(dst_ctx, src_ctx); 29182ef73bcSJens Wiklander } 29282ef73bcSJens Wiklander 293c69bc615SJens Wiklander TEE_Result crypto_mac_init(void *ctx, const uint8_t *key, size_t len) 294e9eaba5cSJens Wiklander { 2955da36a24SJens Wiklander return mac_ops(ctx)->init(ctx, key, len); 296e9eaba5cSJens Wiklander } 297e9eaba5cSJens Wiklander 298c69bc615SJens Wiklander TEE_Result crypto_mac_update(void *ctx, const uint8_t *data, size_t len) 299e9eaba5cSJens Wiklander { 3005da36a24SJens Wiklander if (!len) 3015da36a24SJens Wiklander return TEE_SUCCESS; 3025da36a24SJens Wiklander 3035da36a24SJens Wiklander return mac_ops(ctx)->update(ctx, data, len); 304e9eaba5cSJens Wiklander } 305e9eaba5cSJens Wiklander 306c69bc615SJens Wiklander TEE_Result crypto_mac_final(void *ctx, uint8_t *digest, size_t digest_len) 307e9eaba5cSJens Wiklander { 3085da36a24SJens Wiklander return mac_ops(ctx)->final(ctx, digest, digest_len); 309e9eaba5cSJens Wiklander } 310e9eaba5cSJens Wiklander 311d7ac7d0fSJens Wiklander TEE_Result crypto_authenc_alloc_ctx(void **ctx, uint32_t algo) 3128875ce46SJens Wiklander { 313f1e9b21bSJens Wiklander TEE_Result res = TEE_SUCCESS; 314f1e9b21bSJens Wiklander struct crypto_authenc_ctx *c = NULL; 315f1e9b21bSJens Wiklander 316d0620b01SJens Wiklander switch (algo) { 317d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM) 318d0620b01SJens Wiklander case TEE_ALG_AES_CCM: 319f1e9b21bSJens Wiklander res = crypto_aes_ccm_alloc_ctx(&c); 320f1e9b21bSJens Wiklander break; 321d0620b01SJens Wiklander #endif 322d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM) 323d0620b01SJens Wiklander case TEE_ALG_AES_GCM: 324f1e9b21bSJens Wiklander res = crypto_aes_gcm_alloc_ctx(&c); 325f1e9b21bSJens Wiklander break; 326d0620b01SJens Wiklander #endif 327d0620b01SJens Wiklander default: 3288875ce46SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 3298875ce46SJens Wiklander } 330f1e9b21bSJens Wiklander 331f1e9b21bSJens Wiklander if (!res) 332f1e9b21bSJens Wiklander *ctx = c; 333f1e9b21bSJens Wiklander 334f1e9b21bSJens Wiklander return res; 335d0620b01SJens Wiklander } 3368875ce46SJens Wiklander 337f1e9b21bSJens Wiklander static const struct crypto_authenc_ops *ae_ops(void *ctx) 338d7ac7d0fSJens Wiklander { 339f1e9b21bSJens Wiklander struct crypto_authenc_ctx *c = ctx; 340f1e9b21bSJens Wiklander 341f1e9b21bSJens Wiklander assert(c && c->ops); 342f1e9b21bSJens Wiklander 343f1e9b21bSJens Wiklander return c->ops; 344d7ac7d0fSJens Wiklander } 345d7ac7d0fSJens Wiklander 34652ee414bSJens Wiklander TEE_Result crypto_authenc_init(void *ctx, TEE_OperationMode mode, 347f1e9b21bSJens Wiklander const uint8_t *key, size_t key_len, 348f1e9b21bSJens Wiklander const uint8_t *nonce, size_t nonce_len, 349f1e9b21bSJens Wiklander size_t tag_len, size_t aad_len, 350f1e9b21bSJens Wiklander size_t payload_len) 351d7ac7d0fSJens Wiklander { 352f1e9b21bSJens Wiklander return ae_ops(ctx)->init(ctx, mode, key, key_len, nonce, nonce_len, 353f1e9b21bSJens Wiklander tag_len, aad_len, payload_len); 354d7ac7d0fSJens Wiklander } 355d7ac7d0fSJens Wiklander 35652ee414bSJens Wiklander TEE_Result crypto_authenc_update_aad(void *ctx, TEE_OperationMode mode __unused, 357f1e9b21bSJens Wiklander const uint8_t *data, size_t len) 3588875ce46SJens Wiklander { 359f1e9b21bSJens Wiklander return ae_ops(ctx)->update_aad(ctx, data, len); 360d0620b01SJens Wiklander } 3618875ce46SJens Wiklander 362d0620b01SJens Wiklander 36352ee414bSJens Wiklander TEE_Result crypto_authenc_update_payload(void *ctx, TEE_OperationMode mode, 364f1e9b21bSJens Wiklander const uint8_t *src_data, 365f1e9b21bSJens Wiklander size_t src_len, uint8_t *dst_data, 366f1e9b21bSJens Wiklander size_t *dst_len) 367f1e9b21bSJens Wiklander { 368f1e9b21bSJens Wiklander if (*dst_len < src_len) 369d0620b01SJens Wiklander return TEE_ERROR_SHORT_BUFFER; 370d0620b01SJens Wiklander *dst_len = src_len; 371d0620b01SJens Wiklander 372f1e9b21bSJens Wiklander return ae_ops(ctx)->update_payload(ctx, mode, src_data, src_len, 373f1e9b21bSJens Wiklander dst_data); 374d0620b01SJens Wiklander } 3758875ce46SJens Wiklander 37652ee414bSJens Wiklander TEE_Result crypto_authenc_enc_final(void *ctx, const uint8_t *src_data, 37752ee414bSJens Wiklander size_t src_len, uint8_t *dst_data, 37852ee414bSJens Wiklander size_t *dst_len, uint8_t *dst_tag, 37952ee414bSJens Wiklander size_t *dst_tag_len) 3808875ce46SJens Wiklander { 381f1e9b21bSJens Wiklander if (*dst_len < src_len) 382f1e9b21bSJens Wiklander return TEE_ERROR_SHORT_BUFFER; 383d0620b01SJens Wiklander *dst_len = src_len; 384d0620b01SJens Wiklander 385f1e9b21bSJens Wiklander return ae_ops(ctx)->enc_final(ctx, src_data, src_len, dst_data, 386f1e9b21bSJens Wiklander dst_tag, dst_tag_len); 3878875ce46SJens Wiklander } 3888875ce46SJens Wiklander 38952ee414bSJens Wiklander TEE_Result crypto_authenc_dec_final(void *ctx, const uint8_t *src_data, 39052ee414bSJens Wiklander size_t src_len, uint8_t *dst_data, 39152ee414bSJens Wiklander size_t *dst_len, const uint8_t *tag, 39252ee414bSJens Wiklander size_t tag_len) 3938875ce46SJens Wiklander { 394f1e9b21bSJens Wiklander if (*dst_len < src_len) 395f1e9b21bSJens Wiklander return TEE_ERROR_SHORT_BUFFER; 396f1e9b21bSJens Wiklander *dst_len = src_len; 397f1e9b21bSJens Wiklander 398f1e9b21bSJens Wiklander return ae_ops(ctx)->dec_final(ctx, src_data, src_len, dst_data, tag, 399f1e9b21bSJens Wiklander tag_len); 4008875ce46SJens Wiklander } 401f1e9b21bSJens Wiklander 40252ee414bSJens Wiklander void crypto_authenc_final(void *ctx) 403f1e9b21bSJens Wiklander { 404f1e9b21bSJens Wiklander ae_ops(ctx)->final(ctx); 405f1e9b21bSJens Wiklander } 406f1e9b21bSJens Wiklander 40752ee414bSJens Wiklander void crypto_authenc_free_ctx(void *ctx) 408f1e9b21bSJens Wiklander { 409f1e9b21bSJens Wiklander if (ctx) 410f1e9b21bSJens Wiklander ae_ops(ctx)->free_ctx(ctx); 411f1e9b21bSJens Wiklander } 412f1e9b21bSJens Wiklander 41352ee414bSJens Wiklander void crypto_authenc_copy_state(void *dst_ctx, void *src_ctx) 414f1e9b21bSJens Wiklander { 415f1e9b21bSJens Wiklander ae_ops(dst_ctx)->copy_state(dst_ctx, src_ctx); 416d0620b01SJens Wiklander } 41733790cc1SJens Wiklander 418da1de557SJens Wiklander #if !defined(CFG_CRYPTO_RSA) && !defined(CFG_CRYPTO_DSA) && \ 419da1de557SJens Wiklander !defined(CFG_CRYPTO_DH) && !defined(CFG_CRYPTO_ECC) 42033790cc1SJens Wiklander struct bignum *crypto_bignum_allocate(size_t size_bits __unused) 42133790cc1SJens Wiklander { 42233790cc1SJens Wiklander return NULL; 42333790cc1SJens Wiklander } 42433790cc1SJens Wiklander 42533790cc1SJens Wiklander TEE_Result crypto_bignum_bin2bn(const uint8_t *from __unused, 42633790cc1SJens Wiklander size_t fromsize __unused, 42733790cc1SJens Wiklander struct bignum *to __unused) 42833790cc1SJens Wiklander { 42933790cc1SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 43033790cc1SJens Wiklander } 43133790cc1SJens Wiklander 43233790cc1SJens Wiklander size_t crypto_bignum_num_bytes(struct bignum *a __unused) 43333790cc1SJens Wiklander { 43433790cc1SJens Wiklander return 0; 43533790cc1SJens Wiklander } 43633790cc1SJens Wiklander 43733790cc1SJens Wiklander size_t crypto_bignum_num_bits(struct bignum *a __unused) 43833790cc1SJens Wiklander { 43933790cc1SJens Wiklander return 0; 44033790cc1SJens Wiklander } 44133790cc1SJens Wiklander 44233790cc1SJens Wiklander /* 44333790cc1SJens Wiklander * crypto_bignum_allocate() and crypto_bignum_bin2bn() failing should be 44433790cc1SJens Wiklander * enough to guarantee that the functions calling this function aren't 44533790cc1SJens Wiklander * called, but just in case add a panic() here to avoid unexpected 44633790cc1SJens Wiklander * behavoir. 44733790cc1SJens Wiklander */ 44833790cc1SJens Wiklander static void bignum_cant_happen(void) 44933790cc1SJens Wiklander { 45033790cc1SJens Wiklander volatile bool b = true; 45133790cc1SJens Wiklander 45233790cc1SJens Wiklander /* Avoid warning about function does not return */ 45333790cc1SJens Wiklander if (b) 45433790cc1SJens Wiklander panic(); 45533790cc1SJens Wiklander } 45633790cc1SJens Wiklander 45733790cc1SJens Wiklander void crypto_bignum_bn2bin(const struct bignum *from __unused, 45833790cc1SJens Wiklander uint8_t *to __unused) 45933790cc1SJens Wiklander { 46033790cc1SJens Wiklander bignum_cant_happen(); 46133790cc1SJens Wiklander } 46233790cc1SJens Wiklander 46333790cc1SJens Wiklander void crypto_bignum_copy(struct bignum *to __unused, 46433790cc1SJens Wiklander const struct bignum *from __unused) 46533790cc1SJens Wiklander { 46633790cc1SJens Wiklander bignum_cant_happen(); 46733790cc1SJens Wiklander } 46833790cc1SJens Wiklander 46933790cc1SJens Wiklander void crypto_bignum_free(struct bignum *a) 47033790cc1SJens Wiklander { 47133790cc1SJens Wiklander if (a) 47233790cc1SJens Wiklander panic(); 47333790cc1SJens Wiklander } 47433790cc1SJens Wiklander 47533790cc1SJens Wiklander void crypto_bignum_clear(struct bignum *a __unused) 47633790cc1SJens Wiklander { 47733790cc1SJens Wiklander bignum_cant_happen(); 47833790cc1SJens Wiklander } 47933790cc1SJens Wiklander 48033790cc1SJens Wiklander /* return -1 if a<b, 0 if a==b, +1 if a>b */ 48133790cc1SJens Wiklander int32_t crypto_bignum_compare(struct bignum *a __unused, 48233790cc1SJens Wiklander struct bignum *b __unused) 48333790cc1SJens Wiklander { 48433790cc1SJens Wiklander bignum_cant_happen(); 48533790cc1SJens Wiklander return -1; 48633790cc1SJens Wiklander } 487da1de557SJens Wiklander #endif 488291e5450SJens Wiklander 489da1de557SJens Wiklander #if !defined(CFG_CRYPTO_RSA) 490291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_rsa_keypair(struct rsa_keypair *s __unused, 491291e5450SJens Wiklander size_t key_size_bits __unused) 492291e5450SJens Wiklander { 493291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 494291e5450SJens Wiklander } 495291e5450SJens Wiklander 496291e5450SJens Wiklander TEE_Result 497291e5450SJens Wiklander crypto_acipher_alloc_rsa_public_key(struct rsa_public_key *s __unused, 498291e5450SJens Wiklander size_t key_size_bits __unused) 499291e5450SJens Wiklander { 500291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 501291e5450SJens Wiklander } 502291e5450SJens Wiklander 503291e5450SJens Wiklander void crypto_acipher_free_rsa_public_key(struct rsa_public_key *s __unused) 504291e5450SJens Wiklander { 505291e5450SJens Wiklander } 506291e5450SJens Wiklander 507291e5450SJens Wiklander TEE_Result crypto_acipher_gen_rsa_key(struct rsa_keypair *key __unused, 508291e5450SJens Wiklander size_t key_size __unused) 509291e5450SJens Wiklander { 510291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 511291e5450SJens Wiklander } 512291e5450SJens Wiklander 513291e5450SJens Wiklander TEE_Result crypto_acipher_rsanopad_decrypt(struct rsa_keypair *key __unused, 514291e5450SJens Wiklander const uint8_t *src __unused, 515291e5450SJens Wiklander size_t src_len __unused, 516291e5450SJens Wiklander uint8_t *dst __unused, 517291e5450SJens Wiklander size_t *dst_len __unused) 518291e5450SJens Wiklander { 519291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 520291e5450SJens Wiklander } 521291e5450SJens Wiklander 522291e5450SJens Wiklander TEE_Result crypto_acipher_rsanopad_encrypt(struct rsa_public_key *key __unused, 523291e5450SJens Wiklander const uint8_t *src __unused, 524291e5450SJens Wiklander size_t src_len __unused, 525291e5450SJens Wiklander uint8_t *dst __unused, 526291e5450SJens Wiklander size_t *dst_len __unused) 527291e5450SJens Wiklander { 528291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 529291e5450SJens Wiklander } 530291e5450SJens Wiklander 531291e5450SJens Wiklander TEE_Result crypto_acipher_rsaes_decrypt(uint32_t algo __unused, 532291e5450SJens Wiklander struct rsa_keypair *key __unused, 533291e5450SJens Wiklander const uint8_t *label __unused, 534291e5450SJens Wiklander size_t label_len __unused, 535291e5450SJens Wiklander const uint8_t *src __unused, 536291e5450SJens Wiklander size_t src_len __unused, 537291e5450SJens Wiklander uint8_t *dst __unused, 538291e5450SJens Wiklander size_t *dst_len __unused) 539291e5450SJens Wiklander { 540291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 541291e5450SJens Wiklander } 542291e5450SJens Wiklander 543291e5450SJens Wiklander TEE_Result crypto_acipher_rsaes_encrypt(uint32_t algo __unused, 544291e5450SJens Wiklander struct rsa_public_key *key __unused, 545291e5450SJens Wiklander const uint8_t *label __unused, 546291e5450SJens Wiklander size_t label_len __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_rsassa_sign(uint32_t algo __unused, 556291e5450SJens Wiklander struct rsa_keypair *key __unused, 557291e5450SJens Wiklander int salt_len __unused, 558291e5450SJens Wiklander const uint8_t *msg __unused, 559291e5450SJens Wiklander size_t msg_len __unused, 560291e5450SJens Wiklander uint8_t *sig __unused, 561291e5450SJens Wiklander size_t *sig_len __unused) 562291e5450SJens Wiklander { 563291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 564291e5450SJens Wiklander } 565291e5450SJens Wiklander 566291e5450SJens Wiklander TEE_Result crypto_acipher_rsassa_verify(uint32_t algo __unused, 567291e5450SJens Wiklander struct rsa_public_key *key __unused, 568291e5450SJens Wiklander int salt_len __unused, 569291e5450SJens Wiklander const uint8_t *msg __unused, 570291e5450SJens Wiklander size_t msg_len __unused, 571291e5450SJens Wiklander const uint8_t *sig __unused, 572291e5450SJens Wiklander size_t sig_len __unused) 573291e5450SJens Wiklander { 574291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 575291e5450SJens Wiklander } 576da1de557SJens Wiklander #endif /*!CFG_CRYPTO_RSA*/ 577291e5450SJens Wiklander 578da1de557SJens Wiklander #if !defined(CFG_CRYPTO_DSA) 579291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_dsa_keypair(struct dsa_keypair *s __unused, 580291e5450SJens Wiklander size_t key_size_bits __unused) 581291e5450SJens Wiklander { 582291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 583291e5450SJens Wiklander } 584291e5450SJens Wiklander 585291e5450SJens Wiklander TEE_Result 586291e5450SJens Wiklander crypto_acipher_alloc_dsa_public_key(struct dsa_public_key *s __unused, 587291e5450SJens Wiklander size_t key_size_bits __unused) 588291e5450SJens Wiklander { 589291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 590291e5450SJens Wiklander } 591291e5450SJens Wiklander 592291e5450SJens Wiklander TEE_Result crypto_acipher_gen_dsa_key(struct dsa_keypair *key __unused, 593291e5450SJens Wiklander size_t key_size __unused) 594291e5450SJens Wiklander { 595291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 596291e5450SJens Wiklander } 597291e5450SJens Wiklander 598291e5450SJens Wiklander TEE_Result crypto_acipher_dsa_sign(uint32_t algo __unused, 599291e5450SJens Wiklander struct dsa_keypair *key __unused, 600291e5450SJens Wiklander const uint8_t *msg __unused, 601291e5450SJens Wiklander size_t msg_len __unused, 602291e5450SJens Wiklander uint8_t *sig __unused, 603291e5450SJens Wiklander size_t *sig_len __unused) 604291e5450SJens Wiklander { 605291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 606291e5450SJens Wiklander } 607291e5450SJens Wiklander 608291e5450SJens Wiklander TEE_Result crypto_acipher_dsa_verify(uint32_t algo __unused, 609291e5450SJens Wiklander struct dsa_public_key *key __unused, 610291e5450SJens Wiklander const uint8_t *msg __unused, 611291e5450SJens Wiklander size_t msg_len __unused, 612291e5450SJens Wiklander const uint8_t *sig __unused, 613291e5450SJens Wiklander size_t sig_len __unused) 614291e5450SJens Wiklander { 615291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 616291e5450SJens Wiklander } 617da1de557SJens Wiklander #endif /*!CFG_CRYPTO_DSA*/ 618291e5450SJens Wiklander 619da1de557SJens Wiklander #if !defined(CFG_CRYPTO_DH) 620291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_dh_keypair(struct dh_keypair *s __unused, 621291e5450SJens Wiklander size_t key_size_bits __unused) 622291e5450SJens Wiklander { 623291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 624291e5450SJens Wiklander } 625291e5450SJens Wiklander 626291e5450SJens Wiklander TEE_Result crypto_acipher_gen_dh_key(struct dh_keypair *key __unused, 627291e5450SJens Wiklander struct bignum *q __unused, 628291e5450SJens Wiklander size_t xbits __unused) 629291e5450SJens Wiklander { 630291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 631291e5450SJens Wiklander } 632291e5450SJens Wiklander 633291e5450SJens Wiklander TEE_Result 634291e5450SJens Wiklander crypto_acipher_dh_shared_secret(struct dh_keypair *private_key __unused, 635291e5450SJens Wiklander struct bignum *public_key __unused, 636291e5450SJens Wiklander struct bignum *secret __unused) 637291e5450SJens Wiklander { 638291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 639291e5450SJens Wiklander } 640da1de557SJens Wiklander #endif /*!CFG_CRYPTO_DH*/ 641291e5450SJens Wiklander 642da1de557SJens Wiklander #if !defined(CFG_CRYPTO_ECC) 643291e5450SJens Wiklander TEE_Result 644291e5450SJens Wiklander crypto_acipher_alloc_ecc_public_key(struct ecc_public_key *s __unused, 645291e5450SJens Wiklander size_t key_size_bits __unused) 646291e5450SJens Wiklander { 647291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 648291e5450SJens Wiklander } 649291e5450SJens Wiklander 650291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_ecc_keypair(struct ecc_keypair *s __unused, 651291e5450SJens Wiklander size_t key_size_bits __unused) 652291e5450SJens Wiklander { 653291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 654291e5450SJens Wiklander } 655291e5450SJens Wiklander 656291e5450SJens Wiklander void crypto_acipher_free_ecc_public_key(struct ecc_public_key *s __unused) 657291e5450SJens Wiklander { 658291e5450SJens Wiklander } 659291e5450SJens Wiklander 660291e5450SJens Wiklander TEE_Result crypto_acipher_gen_ecc_key(struct ecc_keypair *key __unused) 661291e5450SJens Wiklander { 662291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 663291e5450SJens Wiklander } 664291e5450SJens Wiklander 665291e5450SJens Wiklander TEE_Result crypto_acipher_ecc_sign(uint32_t algo __unused, 666291e5450SJens Wiklander struct ecc_keypair *key __unused, 667291e5450SJens Wiklander const uint8_t *msg __unused, 668291e5450SJens Wiklander size_t msg_len __unused, 669291e5450SJens Wiklander uint8_t *sig __unused, 670291e5450SJens Wiklander size_t *sig_len __unused) 671291e5450SJens Wiklander { 672291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 673291e5450SJens Wiklander } 674291e5450SJens Wiklander 675291e5450SJens Wiklander TEE_Result crypto_acipher_ecc_verify(uint32_t algo __unused, 676291e5450SJens Wiklander struct ecc_public_key *key __unused, 677291e5450SJens Wiklander const uint8_t *msg __unused, 678291e5450SJens Wiklander size_t msg_len __unused, 679291e5450SJens Wiklander const uint8_t *sig __unused, 680291e5450SJens Wiklander size_t sig_len __unused) 681291e5450SJens Wiklander { 682291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 683291e5450SJens Wiklander } 684291e5450SJens Wiklander 685291e5450SJens Wiklander TEE_Result 686291e5450SJens Wiklander crypto_acipher_ecc_shared_secret(struct ecc_keypair *private_key __unused, 687291e5450SJens Wiklander struct ecc_public_key *public_key __unused, 688291e5450SJens Wiklander void *secret __unused, 689291e5450SJens Wiklander unsigned long *secret_len __unused) 690291e5450SJens Wiklander { 691291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 692291e5450SJens Wiklander } 693da1de557SJens Wiklander #endif /*!CFG_CRYPTO_ECC*/ 69491fc6bd8SJerome Forissier 69591fc6bd8SJerome Forissier #if !defined(CFG_CRYPTO_SM2_PKE) 69691fc6bd8SJerome Forissier TEE_Result crypto_acipher_sm2_pke_decrypt(struct ecc_keypair *key __unused, 69791fc6bd8SJerome Forissier const uint8_t *src __unused, 69891fc6bd8SJerome Forissier size_t src_len __unused, 69991fc6bd8SJerome Forissier uint8_t *dst __unused, 70091fc6bd8SJerome Forissier size_t *dst_len __unused) 70191fc6bd8SJerome Forissier { 70291fc6bd8SJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED; 70391fc6bd8SJerome Forissier } 70491fc6bd8SJerome Forissier 70591fc6bd8SJerome Forissier TEE_Result crypto_acipher_sm2_pke_encrypt(struct ecc_public_key *key __unused, 70691fc6bd8SJerome Forissier const uint8_t *src __unused, 70791fc6bd8SJerome Forissier size_t src_len __unused, 70891fc6bd8SJerome Forissier uint8_t *dst __unused, 70991fc6bd8SJerome Forissier size_t *dst_len __unused) 71091fc6bd8SJerome Forissier { 71191fc6bd8SJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED; 71291fc6bd8SJerome Forissier } 71391fc6bd8SJerome Forissier #endif /* !CFG_CRYPTO_SM2_PKE */ 714*0f151943SJerome Forissier 715*0f151943SJerome Forissier #if !defined(CFG_CRYPTO_SM2_DSA) 716*0f151943SJerome Forissier TEE_Result crypto_acipher_sm2_dsa_sign(uint32_t algo __unused, 717*0f151943SJerome Forissier struct ecc_keypair *key __unused, 718*0f151943SJerome Forissier const uint8_t *msg __unused, 719*0f151943SJerome Forissier size_t msg_len __unused, 720*0f151943SJerome Forissier uint8_t *sig __unused, 721*0f151943SJerome Forissier size_t *sig_len __unused) 722*0f151943SJerome Forissier { 723*0f151943SJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED; 724*0f151943SJerome Forissier } 725*0f151943SJerome Forissier 726*0f151943SJerome Forissier TEE_Result crypto_acipher_sm2_dsa_verify(uint32_t algo __unused, 727*0f151943SJerome Forissier struct ecc_public_key *key __unused, 728*0f151943SJerome Forissier const uint8_t *msg __unused, 729*0f151943SJerome Forissier size_t msg_len __unused, 730*0f151943SJerome Forissier const uint8_t *sig __unused, 731*0f151943SJerome Forissier size_t sig_len __unused) 732*0f151943SJerome Forissier { 733*0f151943SJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED; 734*0f151943SJerome Forissier } 735*0f151943SJerome Forissier #endif /* !CFG_CRYPTO_SM2_DSA */ 736