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 { 176648f482SJens Wiklander TEE_Result res = TEE_SUCCESS; 186648f482SJens Wiklander struct crypto_hash_ctx *c = NULL; 196648f482SJens Wiklander 206648f482SJens Wiklander switch (algo) { 216648f482SJens Wiklander case TEE_ALG_MD5: 226648f482SJens Wiklander res = crypto_md5_alloc_ctx(&c); 236648f482SJens Wiklander break; 246648f482SJens Wiklander case TEE_ALG_SHA1: 256648f482SJens Wiklander res = crypto_sha1_alloc_ctx(&c); 266648f482SJens Wiklander break; 276648f482SJens Wiklander case TEE_ALG_SHA224: 286648f482SJens Wiklander res = crypto_sha224_alloc_ctx(&c); 296648f482SJens Wiklander break; 306648f482SJens Wiklander case TEE_ALG_SHA256: 316648f482SJens Wiklander res = crypto_sha256_alloc_ctx(&c); 326648f482SJens Wiklander break; 336648f482SJens Wiklander case TEE_ALG_SHA384: 346648f482SJens Wiklander res = crypto_sha384_alloc_ctx(&c); 356648f482SJens Wiklander break; 366648f482SJens Wiklander case TEE_ALG_SHA512: 376648f482SJens Wiklander res = crypto_sha512_alloc_ctx(&c); 386648f482SJens Wiklander break; 396648f482SJens Wiklander default: 40b887bd8fSJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 41b887bd8fSJens Wiklander } 42b887bd8fSJens Wiklander 436648f482SJens Wiklander if (!res) 446648f482SJens Wiklander *ctx = c; 456648f482SJens Wiklander 466648f482SJens Wiklander return res; 476648f482SJens Wiklander } 486648f482SJens Wiklander 496648f482SJens Wiklander static const struct crypto_hash_ops *hash_ops(void *ctx) 506648f482SJens Wiklander { 516648f482SJens Wiklander struct crypto_hash_ctx *c = ctx; 526648f482SJens Wiklander 536648f482SJens Wiklander assert(c && c->ops); 546648f482SJens Wiklander 556648f482SJens Wiklander return c->ops; 566648f482SJens Wiklander } 576648f482SJens Wiklander 58ce7a47f5SJerome Forissier void crypto_hash_free_ctx(void *ctx, uint32_t algo __unused) 59ecf2e014SJens Wiklander { 60ce7a47f5SJerome Forissier if (ctx) 616648f482SJens Wiklander hash_ops(ctx)->free_ctx(ctx); 62ecf2e014SJens Wiklander } 63ecf2e014SJens Wiklander 646648f482SJens Wiklander void crypto_hash_copy_state(void *dst_ctx, void *src_ctx, 65ecf2e014SJens Wiklander uint32_t algo __unused) 66ecf2e014SJens Wiklander { 676648f482SJens Wiklander hash_ops(dst_ctx)->copy_state(dst_ctx, src_ctx); 68ecf2e014SJens Wiklander } 69ecf2e014SJens Wiklander 706648f482SJens Wiklander TEE_Result crypto_hash_init(void *ctx, uint32_t algo __unused) 71b887bd8fSJens Wiklander { 726648f482SJens Wiklander return hash_ops(ctx)->init(ctx); 73b887bd8fSJens Wiklander } 746648f482SJens Wiklander 756648f482SJens Wiklander TEE_Result crypto_hash_update(void *ctx, uint32_t algo __unused, 766648f482SJens Wiklander const uint8_t *data, size_t len) 77b887bd8fSJens Wiklander { 786648f482SJens Wiklander return hash_ops(ctx)->update(ctx, data, len); 79b887bd8fSJens Wiklander } 806648f482SJens Wiklander 816648f482SJens Wiklander TEE_Result crypto_hash_final(void *ctx, uint32_t algo __unused, 826648f482SJens Wiklander uint8_t *digest, size_t len) 83b887bd8fSJens Wiklander { 846648f482SJens Wiklander return hash_ops(ctx)->final(ctx, digest, len); 85b887bd8fSJens Wiklander } 8682d91db1SJens Wiklander 8796098f01SJens Wiklander TEE_Result crypto_cipher_alloc_ctx(void **ctx, uint32_t algo) 8882d91db1SJens Wiklander { 8996098f01SJens Wiklander TEE_Result res = TEE_SUCCESS; 9096098f01SJens Wiklander struct crypto_cipher_ctx *c = NULL; 9196098f01SJens Wiklander 9296098f01SJens Wiklander switch (algo) { 9396098f01SJens Wiklander case TEE_ALG_AES_ECB_NOPAD: 9496098f01SJens Wiklander res = crypto_aes_ecb_alloc_ctx(&c); 9596098f01SJens Wiklander break; 9696098f01SJens Wiklander case TEE_ALG_AES_CBC_NOPAD: 9796098f01SJens Wiklander res = crypto_aes_cbc_alloc_ctx(&c); 9896098f01SJens Wiklander break; 9996098f01SJens Wiklander case TEE_ALG_AES_CTR: 10096098f01SJens Wiklander res = crypto_aes_ctr_alloc_ctx(&c); 10196098f01SJens Wiklander break; 10296098f01SJens Wiklander case TEE_ALG_AES_CTS: 10396098f01SJens Wiklander res = crypto_aes_cts_alloc_ctx(&c); 10496098f01SJens Wiklander break; 10596098f01SJens Wiklander case TEE_ALG_AES_XTS: 10696098f01SJens Wiklander res = crypto_aes_xts_alloc_ctx(&c); 10796098f01SJens Wiklander break; 10896098f01SJens Wiklander case TEE_ALG_DES_ECB_NOPAD: 10996098f01SJens Wiklander res = crypto_des_ecb_alloc_ctx(&c); 11096098f01SJens Wiklander break; 11196098f01SJens Wiklander case TEE_ALG_DES3_ECB_NOPAD: 11296098f01SJens Wiklander res = crypto_des3_ecb_alloc_ctx(&c); 11396098f01SJens Wiklander break; 11496098f01SJens Wiklander case TEE_ALG_DES_CBC_NOPAD: 11596098f01SJens Wiklander res = crypto_des_cbc_alloc_ctx(&c); 11696098f01SJens Wiklander break; 11796098f01SJens Wiklander case TEE_ALG_DES3_CBC_NOPAD: 11896098f01SJens Wiklander res = crypto_des3_cbc_alloc_ctx(&c); 11996098f01SJens Wiklander break; 12096098f01SJens Wiklander default: 1211c5fdd1fSJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED; 12282d91db1SJens Wiklander } 12382d91db1SJens Wiklander 12496098f01SJens Wiklander if (!res) 12596098f01SJens Wiklander *ctx = c; 12696098f01SJens Wiklander 12796098f01SJens Wiklander return res; 12896098f01SJens Wiklander } 12996098f01SJens Wiklander 13096098f01SJens Wiklander static const struct crypto_cipher_ops *cipher_ops(void *ctx) 13196098f01SJens Wiklander { 13296098f01SJens Wiklander struct crypto_cipher_ctx *c = ctx; 13396098f01SJens Wiklander 13496098f01SJens Wiklander assert(c && c->ops); 13596098f01SJens Wiklander 13696098f01SJens Wiklander return c->ops; 13796098f01SJens Wiklander } 13896098f01SJens Wiklander 139ce7a47f5SJerome Forissier void crypto_cipher_free_ctx(void *ctx, uint32_t algo __unused) 14072a9b1a0SJens Wiklander { 141ce7a47f5SJerome Forissier if (ctx) 14296098f01SJens Wiklander cipher_ops(ctx)->free_ctx(ctx); 14372a9b1a0SJens Wiklander } 14472a9b1a0SJens Wiklander 14596098f01SJens Wiklander void crypto_cipher_copy_state(void *dst_ctx, void *src_ctx, 14672a9b1a0SJens Wiklander uint32_t algo __unused) 14772a9b1a0SJens Wiklander { 14896098f01SJens Wiklander cipher_ops(dst_ctx)->copy_state(dst_ctx, src_ctx); 14972a9b1a0SJens Wiklander } 15072a9b1a0SJens Wiklander 15182d91db1SJens Wiklander TEE_Result crypto_cipher_init(void *ctx __unused, uint32_t algo __unused, 15296098f01SJens Wiklander TEE_OperationMode mode, const uint8_t *key1, 15396098f01SJens Wiklander size_t key1_len, const uint8_t *key2, 15496098f01SJens Wiklander size_t key2_len, const uint8_t *iv, size_t iv_len) 15582d91db1SJens Wiklander { 15696098f01SJens Wiklander if (mode != TEE_MODE_DECRYPT && mode != TEE_MODE_ENCRYPT) 15796098f01SJens Wiklander return TEE_ERROR_BAD_PARAMETERS; 15896098f01SJens Wiklander 15996098f01SJens Wiklander return cipher_ops(ctx)->init(ctx, mode, key1, key1_len, key2, key2_len, 16096098f01SJens Wiklander iv, iv_len); 16182d91db1SJens Wiklander } 16282d91db1SJens Wiklander 16396098f01SJens Wiklander TEE_Result crypto_cipher_update(void *ctx, uint32_t algo __unused, 16482d91db1SJens Wiklander TEE_OperationMode mode __unused, 16596098f01SJens Wiklander bool last_block, const uint8_t *data, 16696098f01SJens Wiklander size_t len, uint8_t *dst) 16782d91db1SJens Wiklander { 16896098f01SJens Wiklander return cipher_ops(ctx)->update(ctx, last_block, data, len, dst); 16982d91db1SJens Wiklander } 17082d91db1SJens Wiklander 17196098f01SJens Wiklander void crypto_cipher_final(void *ctx, uint32_t algo __unused) 17282d91db1SJens Wiklander { 17396098f01SJens Wiklander cipher_ops(ctx)->final(ctx); 17482d91db1SJens Wiklander } 175e9eaba5cSJens Wiklander 1766d259e05SJens Wiklander TEE_Result crypto_cipher_get_block_size(uint32_t algo, size_t *size) 1776d259e05SJens Wiklander { 1786d259e05SJens Wiklander uint32_t class = TEE_ALG_GET_CLASS(algo); 1796d259e05SJens Wiklander 1806d259e05SJens Wiklander if (class != TEE_OPERATION_CIPHER && class != TEE_OPERATION_MAC && 1816d259e05SJens Wiklander class != TEE_OPERATION_AE) 1826d259e05SJens Wiklander return TEE_ERROR_BAD_PARAMETERS; 1836d259e05SJens Wiklander 1846d259e05SJens Wiklander switch (TEE_ALG_GET_MAIN_ALG(algo)) { 1856d259e05SJens Wiklander case TEE_MAIN_ALGO_AES: 1866d259e05SJens Wiklander *size = TEE_AES_BLOCK_SIZE; 1876d259e05SJens Wiklander return TEE_SUCCESS; 1886d259e05SJens Wiklander case TEE_MAIN_ALGO_DES: 1896d259e05SJens Wiklander case TEE_MAIN_ALGO_DES3: 1906d259e05SJens Wiklander *size = TEE_DES_BLOCK_SIZE; 1916d259e05SJens Wiklander return TEE_SUCCESS; 1926d259e05SJens Wiklander default: 1936d259e05SJens Wiklander return TEE_ERROR_NOT_SUPPORTED; 1946d259e05SJens Wiklander } 1956d259e05SJens Wiklander } 1966d259e05SJens Wiklander 1975da36a24SJens Wiklander TEE_Result crypto_mac_alloc_ctx(void **ctx, uint32_t algo) 198e9eaba5cSJens Wiklander { 1995da36a24SJens Wiklander TEE_Result res = TEE_SUCCESS; 2005da36a24SJens Wiklander struct crypto_mac_ctx *c = NULL; 2015da36a24SJens Wiklander 2025da36a24SJens Wiklander switch (algo) { 2035da36a24SJens Wiklander case TEE_ALG_HMAC_MD5: 2045da36a24SJens Wiklander res = crypto_hmac_md5_alloc_ctx(&c); 2055da36a24SJens Wiklander break; 2065da36a24SJens Wiklander case TEE_ALG_HMAC_SHA1: 2075da36a24SJens Wiklander res = crypto_hmac_sha1_alloc_ctx(&c); 2085da36a24SJens Wiklander break; 2095da36a24SJens Wiklander case TEE_ALG_HMAC_SHA224: 2105da36a24SJens Wiklander res = crypto_hmac_sha224_alloc_ctx(&c); 2115da36a24SJens Wiklander break; 2125da36a24SJens Wiklander case TEE_ALG_HMAC_SHA256: 2135da36a24SJens Wiklander res = crypto_hmac_sha256_alloc_ctx(&c); 2145da36a24SJens Wiklander break; 2155da36a24SJens Wiklander case TEE_ALG_HMAC_SHA384: 2165da36a24SJens Wiklander res = crypto_hmac_sha384_alloc_ctx(&c); 2175da36a24SJens Wiklander break; 2185da36a24SJens Wiklander case TEE_ALG_HMAC_SHA512: 2195da36a24SJens Wiklander res = crypto_hmac_sha512_alloc_ctx(&c); 2205da36a24SJens Wiklander break; 2215da36a24SJens Wiklander case TEE_ALG_AES_CBC_MAC_NOPAD: 2225da36a24SJens Wiklander res = crypto_aes_cbc_mac_nopad_alloc_ctx(&c); 2235da36a24SJens Wiklander break; 2245da36a24SJens Wiklander case TEE_ALG_AES_CBC_MAC_PKCS5: 2255da36a24SJens Wiklander res = crypto_aes_cbc_mac_pkcs5_alloc_ctx(&c); 2265da36a24SJens Wiklander break; 2275da36a24SJens Wiklander case TEE_ALG_DES_CBC_MAC_NOPAD: 2285da36a24SJens Wiklander res = crypto_des_cbc_mac_nopad_alloc_ctx(&c); 2295da36a24SJens Wiklander break; 2305da36a24SJens Wiklander case TEE_ALG_DES_CBC_MAC_PKCS5: 2315da36a24SJens Wiklander res = crypto_des_cbc_mac_pkcs5_alloc_ctx(&c); 2325da36a24SJens Wiklander break; 2335da36a24SJens Wiklander case TEE_ALG_DES3_CBC_MAC_NOPAD: 2345da36a24SJens Wiklander res = crypto_des3_cbc_mac_nopad_alloc_ctx(&c); 2355da36a24SJens Wiklander break; 2365da36a24SJens Wiklander case TEE_ALG_DES3_CBC_MAC_PKCS5: 2375da36a24SJens Wiklander res = crypto_des3_cbc_mac_pkcs5_alloc_ctx(&c); 2385da36a24SJens Wiklander break; 2395da36a24SJens Wiklander case TEE_ALG_AES_CMAC: 2405da36a24SJens Wiklander res = crypto_aes_cmac_alloc_ctx(&c); 2415da36a24SJens Wiklander break; 2425da36a24SJens Wiklander default: 2435da36a24SJens Wiklander return TEE_ERROR_NOT_SUPPORTED; 2445da36a24SJens Wiklander } 2455da36a24SJens Wiklander 2465da36a24SJens Wiklander if (!res) 2475da36a24SJens Wiklander *ctx = c; 2485da36a24SJens Wiklander 2495da36a24SJens Wiklander return res; 2505da36a24SJens Wiklander } 2515da36a24SJens Wiklander 2525da36a24SJens Wiklander static const struct crypto_mac_ops *mac_ops(void *ctx) 2535da36a24SJens Wiklander { 2545da36a24SJens Wiklander struct crypto_mac_ctx *c = ctx; 2555da36a24SJens Wiklander 2565da36a24SJens Wiklander assert(c && c->ops); 2575da36a24SJens Wiklander 2585da36a24SJens Wiklander return c->ops; 259e9eaba5cSJens Wiklander } 260e9eaba5cSJens Wiklander 261ce7a47f5SJerome Forissier void crypto_mac_free_ctx(void *ctx, uint32_t algo __unused) 26282ef73bcSJens Wiklander { 263ce7a47f5SJerome Forissier if (ctx) 2645da36a24SJens Wiklander mac_ops(ctx)->free_ctx(ctx); 26582ef73bcSJens Wiklander } 26682ef73bcSJens Wiklander 2675da36a24SJens Wiklander void crypto_mac_copy_state(void *dst_ctx, void *src_ctx, uint32_t algo __unused) 26882ef73bcSJens Wiklander { 2695da36a24SJens Wiklander mac_ops(dst_ctx)->copy_state(dst_ctx, src_ctx); 27082ef73bcSJens Wiklander } 27182ef73bcSJens Wiklander 2725da36a24SJens Wiklander TEE_Result crypto_mac_init(void *ctx, uint32_t algo __unused, 2735da36a24SJens Wiklander const uint8_t *key, size_t len) 274e9eaba5cSJens Wiklander { 2755da36a24SJens Wiklander return mac_ops(ctx)->init(ctx, key, len); 276e9eaba5cSJens Wiklander } 277e9eaba5cSJens Wiklander 2785da36a24SJens Wiklander TEE_Result crypto_mac_update(void *ctx, uint32_t algo __unused, 2795da36a24SJens Wiklander const uint8_t *data, size_t len) 280e9eaba5cSJens Wiklander { 2815da36a24SJens Wiklander if (!len) 2825da36a24SJens Wiklander return TEE_SUCCESS; 2835da36a24SJens Wiklander 2845da36a24SJens Wiklander return mac_ops(ctx)->update(ctx, data, len); 285e9eaba5cSJens Wiklander } 286e9eaba5cSJens Wiklander 2875da36a24SJens Wiklander TEE_Result crypto_mac_final(void *ctx, uint32_t algo __unused, 2885da36a24SJens Wiklander uint8_t *digest, size_t digest_len) 289e9eaba5cSJens Wiklander { 2905da36a24SJens Wiklander return mac_ops(ctx)->final(ctx, digest, digest_len); 291e9eaba5cSJens Wiklander } 292e9eaba5cSJens Wiklander 293d7ac7d0fSJens Wiklander TEE_Result crypto_authenc_alloc_ctx(void **ctx, uint32_t algo) 2948875ce46SJens Wiklander { 295*f1e9b21bSJens Wiklander TEE_Result res = TEE_SUCCESS; 296*f1e9b21bSJens Wiklander struct crypto_authenc_ctx *c = NULL; 297*f1e9b21bSJens Wiklander 298d0620b01SJens Wiklander switch (algo) { 299d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM) 300d0620b01SJens Wiklander case TEE_ALG_AES_CCM: 301*f1e9b21bSJens Wiklander res = crypto_aes_ccm_alloc_ctx(&c); 302*f1e9b21bSJens Wiklander break; 303d0620b01SJens Wiklander #endif 304d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM) 305d0620b01SJens Wiklander case TEE_ALG_AES_GCM: 306*f1e9b21bSJens Wiklander res = crypto_aes_gcm_alloc_ctx(&c); 307*f1e9b21bSJens Wiklander break; 308d0620b01SJens Wiklander #endif 309d0620b01SJens Wiklander default: 3108875ce46SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 3118875ce46SJens Wiklander } 312*f1e9b21bSJens Wiklander 313*f1e9b21bSJens Wiklander if (!res) 314*f1e9b21bSJens Wiklander *ctx = c; 315*f1e9b21bSJens Wiklander 316*f1e9b21bSJens Wiklander return res; 317d0620b01SJens Wiklander } 3188875ce46SJens Wiklander 319*f1e9b21bSJens Wiklander static const struct crypto_authenc_ops *ae_ops(void *ctx) 320d7ac7d0fSJens Wiklander { 321*f1e9b21bSJens Wiklander struct crypto_authenc_ctx *c = ctx; 322*f1e9b21bSJens Wiklander 323*f1e9b21bSJens Wiklander assert(c && c->ops); 324*f1e9b21bSJens Wiklander 325*f1e9b21bSJens Wiklander return c->ops; 326d7ac7d0fSJens Wiklander } 327d7ac7d0fSJens Wiklander 328*f1e9b21bSJens Wiklander TEE_Result crypto_authenc_init(void *ctx, uint32_t algo __unused, 329*f1e9b21bSJens Wiklander TEE_OperationMode mode, 330*f1e9b21bSJens Wiklander const uint8_t *key, size_t key_len, 331*f1e9b21bSJens Wiklander const uint8_t *nonce, size_t nonce_len, 332*f1e9b21bSJens Wiklander size_t tag_len, size_t aad_len, 333*f1e9b21bSJens Wiklander size_t payload_len) 334d7ac7d0fSJens Wiklander { 335*f1e9b21bSJens Wiklander return ae_ops(ctx)->init(ctx, mode, key, key_len, nonce, nonce_len, 336*f1e9b21bSJens Wiklander tag_len, aad_len, payload_len); 337d7ac7d0fSJens Wiklander } 338d7ac7d0fSJens Wiklander 339*f1e9b21bSJens Wiklander TEE_Result crypto_authenc_update_aad(void *ctx, uint32_t algo __unused, 3408875ce46SJens Wiklander TEE_OperationMode mode __unused, 341*f1e9b21bSJens Wiklander const uint8_t *data, size_t len) 3428875ce46SJens Wiklander { 343*f1e9b21bSJens Wiklander return ae_ops(ctx)->update_aad(ctx, data, len); 344d0620b01SJens Wiklander } 3458875ce46SJens Wiklander 346d0620b01SJens Wiklander 347*f1e9b21bSJens Wiklander TEE_Result crypto_authenc_update_payload(void *ctx, uint32_t algo __unused, 348*f1e9b21bSJens Wiklander TEE_OperationMode mode, 349*f1e9b21bSJens Wiklander const uint8_t *src_data, 350*f1e9b21bSJens Wiklander size_t src_len, uint8_t *dst_data, 351*f1e9b21bSJens Wiklander size_t *dst_len) 352*f1e9b21bSJens Wiklander { 353*f1e9b21bSJens Wiklander if (*dst_len < src_len) 354d0620b01SJens Wiklander return TEE_ERROR_SHORT_BUFFER; 355d0620b01SJens Wiklander *dst_len = src_len; 356d0620b01SJens Wiklander 357*f1e9b21bSJens Wiklander return ae_ops(ctx)->update_payload(ctx, mode, src_data, src_len, 358*f1e9b21bSJens Wiklander dst_data); 359d0620b01SJens Wiklander } 3608875ce46SJens Wiklander 361*f1e9b21bSJens Wiklander TEE_Result crypto_authenc_enc_final(void *ctx, uint32_t algo __unused, 362*f1e9b21bSJens Wiklander const uint8_t *src_data, size_t src_len, 363*f1e9b21bSJens Wiklander uint8_t *dst_data, size_t *dst_len, 364*f1e9b21bSJens Wiklander uint8_t *dst_tag, size_t *dst_tag_len) 3658875ce46SJens Wiklander { 366*f1e9b21bSJens Wiklander if (*dst_len < src_len) 367*f1e9b21bSJens Wiklander return TEE_ERROR_SHORT_BUFFER; 368d0620b01SJens Wiklander *dst_len = src_len; 369d0620b01SJens Wiklander 370*f1e9b21bSJens Wiklander return ae_ops(ctx)->enc_final(ctx, src_data, src_len, dst_data, 371*f1e9b21bSJens Wiklander dst_tag, dst_tag_len); 3728875ce46SJens Wiklander } 3738875ce46SJens Wiklander 374*f1e9b21bSJens Wiklander TEE_Result crypto_authenc_dec_final(void *ctx, uint32_t algo __unused, 375*f1e9b21bSJens Wiklander const uint8_t *src_data, size_t src_len, 376*f1e9b21bSJens Wiklander uint8_t *dst_data, size_t *dst_len, 377*f1e9b21bSJens Wiklander const uint8_t *tag, size_t tag_len) 3788875ce46SJens Wiklander { 379*f1e9b21bSJens Wiklander if (*dst_len < src_len) 380*f1e9b21bSJens Wiklander return TEE_ERROR_SHORT_BUFFER; 381*f1e9b21bSJens Wiklander *dst_len = src_len; 382*f1e9b21bSJens Wiklander 383*f1e9b21bSJens Wiklander return ae_ops(ctx)->dec_final(ctx, src_data, src_len, dst_data, tag, 384*f1e9b21bSJens Wiklander tag_len); 3858875ce46SJens Wiklander } 386*f1e9b21bSJens Wiklander 387*f1e9b21bSJens Wiklander void crypto_authenc_final(void *ctx, uint32_t algo __unused) 388*f1e9b21bSJens Wiklander { 389*f1e9b21bSJens Wiklander ae_ops(ctx)->final(ctx); 390*f1e9b21bSJens Wiklander } 391*f1e9b21bSJens Wiklander 392*f1e9b21bSJens Wiklander void crypto_authenc_free_ctx(void *ctx, uint32_t algo __unused) 393*f1e9b21bSJens Wiklander { 394*f1e9b21bSJens Wiklander if (ctx) 395*f1e9b21bSJens Wiklander ae_ops(ctx)->free_ctx(ctx); 396*f1e9b21bSJens Wiklander } 397*f1e9b21bSJens Wiklander 398*f1e9b21bSJens Wiklander void crypto_authenc_copy_state(void *dst_ctx, void *src_ctx, 399*f1e9b21bSJens Wiklander uint32_t algo __unused) 400*f1e9b21bSJens Wiklander { 401*f1e9b21bSJens Wiklander ae_ops(dst_ctx)->copy_state(dst_ctx, src_ctx); 402d0620b01SJens Wiklander } 40333790cc1SJens Wiklander 40433790cc1SJens Wiklander #if !defined(_CFG_CRYPTO_WITH_ACIPHER) 40533790cc1SJens Wiklander struct bignum *crypto_bignum_allocate(size_t size_bits __unused) 40633790cc1SJens Wiklander { 40733790cc1SJens Wiklander return NULL; 40833790cc1SJens Wiklander } 40933790cc1SJens Wiklander 41033790cc1SJens Wiklander TEE_Result crypto_bignum_bin2bn(const uint8_t *from __unused, 41133790cc1SJens Wiklander size_t fromsize __unused, 41233790cc1SJens Wiklander struct bignum *to __unused) 41333790cc1SJens Wiklander { 41433790cc1SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 41533790cc1SJens Wiklander } 41633790cc1SJens Wiklander 41733790cc1SJens Wiklander size_t crypto_bignum_num_bytes(struct bignum *a __unused) 41833790cc1SJens Wiklander { 41933790cc1SJens Wiklander return 0; 42033790cc1SJens Wiklander } 42133790cc1SJens Wiklander 42233790cc1SJens Wiklander size_t crypto_bignum_num_bits(struct bignum *a __unused) 42333790cc1SJens Wiklander { 42433790cc1SJens Wiklander return 0; 42533790cc1SJens Wiklander } 42633790cc1SJens Wiklander 42733790cc1SJens Wiklander /* 42833790cc1SJens Wiklander * crypto_bignum_allocate() and crypto_bignum_bin2bn() failing should be 42933790cc1SJens Wiklander * enough to guarantee that the functions calling this function aren't 43033790cc1SJens Wiklander * called, but just in case add a panic() here to avoid unexpected 43133790cc1SJens Wiklander * behavoir. 43233790cc1SJens Wiklander */ 43333790cc1SJens Wiklander static void bignum_cant_happen(void) 43433790cc1SJens Wiklander { 43533790cc1SJens Wiklander volatile bool b = true; 43633790cc1SJens Wiklander 43733790cc1SJens Wiklander /* Avoid warning about function does not return */ 43833790cc1SJens Wiklander if (b) 43933790cc1SJens Wiklander panic(); 44033790cc1SJens Wiklander } 44133790cc1SJens Wiklander 44233790cc1SJens Wiklander void crypto_bignum_bn2bin(const struct bignum *from __unused, 44333790cc1SJens Wiklander uint8_t *to __unused) 44433790cc1SJens Wiklander { 44533790cc1SJens Wiklander bignum_cant_happen(); 44633790cc1SJens Wiklander } 44733790cc1SJens Wiklander 44833790cc1SJens Wiklander void crypto_bignum_copy(struct bignum *to __unused, 44933790cc1SJens Wiklander const struct bignum *from __unused) 45033790cc1SJens Wiklander { 45133790cc1SJens Wiklander bignum_cant_happen(); 45233790cc1SJens Wiklander } 45333790cc1SJens Wiklander 45433790cc1SJens Wiklander void crypto_bignum_free(struct bignum *a) 45533790cc1SJens Wiklander { 45633790cc1SJens Wiklander if (a) 45733790cc1SJens Wiklander panic(); 45833790cc1SJens Wiklander } 45933790cc1SJens Wiklander 46033790cc1SJens Wiklander void crypto_bignum_clear(struct bignum *a __unused) 46133790cc1SJens Wiklander { 46233790cc1SJens Wiklander bignum_cant_happen(); 46333790cc1SJens Wiklander } 46433790cc1SJens Wiklander 46533790cc1SJens Wiklander /* return -1 if a<b, 0 if a==b, +1 if a>b */ 46633790cc1SJens Wiklander int32_t crypto_bignum_compare(struct bignum *a __unused, 46733790cc1SJens Wiklander struct bignum *b __unused) 46833790cc1SJens Wiklander { 46933790cc1SJens Wiklander bignum_cant_happen(); 47033790cc1SJens Wiklander return -1; 47133790cc1SJens Wiklander } 47233790cc1SJens Wiklander #endif /*!_CFG_CRYPTO_WITH_ACIPHER*/ 473291e5450SJens Wiklander 474291e5450SJens Wiklander #if !defined(CFG_CRYPTO_RSA) || !defined(_CFG_CRYPTO_WITH_ACIPHER) 475291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_rsa_keypair(struct rsa_keypair *s __unused, 476291e5450SJens Wiklander size_t key_size_bits __unused) 477291e5450SJens Wiklander { 478291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 479291e5450SJens Wiklander } 480291e5450SJens Wiklander 481291e5450SJens Wiklander TEE_Result 482291e5450SJens Wiklander crypto_acipher_alloc_rsa_public_key(struct rsa_public_key *s __unused, 483291e5450SJens Wiklander size_t key_size_bits __unused) 484291e5450SJens Wiklander { 485291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 486291e5450SJens Wiklander } 487291e5450SJens Wiklander 488291e5450SJens Wiklander void crypto_acipher_free_rsa_public_key(struct rsa_public_key *s __unused) 489291e5450SJens Wiklander { 490291e5450SJens Wiklander } 491291e5450SJens Wiklander 492291e5450SJens Wiklander TEE_Result crypto_acipher_gen_rsa_key(struct rsa_keypair *key __unused, 493291e5450SJens Wiklander size_t key_size __unused) 494291e5450SJens Wiklander { 495291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 496291e5450SJens Wiklander } 497291e5450SJens Wiklander 498291e5450SJens Wiklander TEE_Result crypto_acipher_rsanopad_decrypt(struct rsa_keypair *key __unused, 499291e5450SJens Wiklander const uint8_t *src __unused, 500291e5450SJens Wiklander size_t src_len __unused, 501291e5450SJens Wiklander uint8_t *dst __unused, 502291e5450SJens Wiklander size_t *dst_len __unused) 503291e5450SJens Wiklander { 504291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 505291e5450SJens Wiklander } 506291e5450SJens Wiklander 507291e5450SJens Wiklander TEE_Result crypto_acipher_rsanopad_encrypt(struct rsa_public_key *key __unused, 508291e5450SJens Wiklander const uint8_t *src __unused, 509291e5450SJens Wiklander size_t src_len __unused, 510291e5450SJens Wiklander uint8_t *dst __unused, 511291e5450SJens Wiklander size_t *dst_len __unused) 512291e5450SJens Wiklander { 513291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 514291e5450SJens Wiklander } 515291e5450SJens Wiklander 516291e5450SJens Wiklander TEE_Result crypto_acipher_rsaes_decrypt(uint32_t algo __unused, 517291e5450SJens Wiklander struct rsa_keypair *key __unused, 518291e5450SJens Wiklander const uint8_t *label __unused, 519291e5450SJens Wiklander size_t label_len __unused, 520291e5450SJens Wiklander const uint8_t *src __unused, 521291e5450SJens Wiklander size_t src_len __unused, 522291e5450SJens Wiklander uint8_t *dst __unused, 523291e5450SJens Wiklander size_t *dst_len __unused) 524291e5450SJens Wiklander { 525291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 526291e5450SJens Wiklander } 527291e5450SJens Wiklander 528291e5450SJens Wiklander TEE_Result crypto_acipher_rsaes_encrypt(uint32_t algo __unused, 529291e5450SJens Wiklander struct rsa_public_key *key __unused, 530291e5450SJens Wiklander const uint8_t *label __unused, 531291e5450SJens Wiklander size_t label_len __unused, 532291e5450SJens Wiklander const uint8_t *src __unused, 533291e5450SJens Wiklander size_t src_len __unused, 534291e5450SJens Wiklander uint8_t *dst __unused, 535291e5450SJens Wiklander size_t *dst_len __unused) 536291e5450SJens Wiklander { 537291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 538291e5450SJens Wiklander } 539291e5450SJens Wiklander 540291e5450SJens Wiklander TEE_Result crypto_acipher_rsassa_sign(uint32_t algo __unused, 541291e5450SJens Wiklander struct rsa_keypair *key __unused, 542291e5450SJens Wiklander int salt_len __unused, 543291e5450SJens Wiklander const uint8_t *msg __unused, 544291e5450SJens Wiklander size_t msg_len __unused, 545291e5450SJens Wiklander uint8_t *sig __unused, 546291e5450SJens Wiklander size_t *sig_len __unused) 547291e5450SJens Wiklander { 548291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 549291e5450SJens Wiklander } 550291e5450SJens Wiklander 551291e5450SJens Wiklander TEE_Result crypto_acipher_rsassa_verify(uint32_t algo __unused, 552291e5450SJens Wiklander struct rsa_public_key *key __unused, 553291e5450SJens Wiklander int salt_len __unused, 554291e5450SJens Wiklander const uint8_t *msg __unused, 555291e5450SJens Wiklander size_t msg_len __unused, 556291e5450SJens Wiklander const uint8_t *sig __unused, 557291e5450SJens Wiklander size_t sig_len __unused) 558291e5450SJens Wiklander { 559291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 560291e5450SJens Wiklander } 561291e5450SJens Wiklander #endif /*!CFG_CRYPTO_RSA || !_CFG_CRYPTO_WITH_ACIPHER*/ 562291e5450SJens Wiklander 563291e5450SJens Wiklander #if !defined(CFG_CRYPTO_DSA) || !defined(_CFG_CRYPTO_WITH_ACIPHER) 564291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_dsa_keypair(struct dsa_keypair *s __unused, 565291e5450SJens Wiklander size_t key_size_bits __unused) 566291e5450SJens Wiklander { 567291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 568291e5450SJens Wiklander } 569291e5450SJens Wiklander 570291e5450SJens Wiklander TEE_Result 571291e5450SJens Wiklander crypto_acipher_alloc_dsa_public_key(struct dsa_public_key *s __unused, 572291e5450SJens Wiklander size_t key_size_bits __unused) 573291e5450SJens Wiklander { 574291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 575291e5450SJens Wiklander } 576291e5450SJens Wiklander 577291e5450SJens Wiklander TEE_Result crypto_acipher_gen_dsa_key(struct dsa_keypair *key __unused, 578291e5450SJens Wiklander size_t key_size __unused) 579291e5450SJens Wiklander { 580291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 581291e5450SJens Wiklander } 582291e5450SJens Wiklander 583291e5450SJens Wiklander TEE_Result crypto_acipher_dsa_sign(uint32_t algo __unused, 584291e5450SJens Wiklander struct dsa_keypair *key __unused, 585291e5450SJens Wiklander const uint8_t *msg __unused, 586291e5450SJens Wiklander size_t msg_len __unused, 587291e5450SJens Wiklander uint8_t *sig __unused, 588291e5450SJens Wiklander size_t *sig_len __unused) 589291e5450SJens Wiklander { 590291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 591291e5450SJens Wiklander } 592291e5450SJens Wiklander 593291e5450SJens Wiklander TEE_Result crypto_acipher_dsa_verify(uint32_t algo __unused, 594291e5450SJens Wiklander struct dsa_public_key *key __unused, 595291e5450SJens Wiklander const uint8_t *msg __unused, 596291e5450SJens Wiklander size_t msg_len __unused, 597291e5450SJens Wiklander const uint8_t *sig __unused, 598291e5450SJens Wiklander size_t sig_len __unused) 599291e5450SJens Wiklander { 600291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 601291e5450SJens Wiklander } 602291e5450SJens Wiklander #endif /*!CFG_CRYPTO_DSA || !_CFG_CRYPTO_WITH_ACIPHER*/ 603291e5450SJens Wiklander 604291e5450SJens Wiklander #if !defined(CFG_CRYPTO_DH) || !defined(_CFG_CRYPTO_WITH_ACIPHER) 605291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_dh_keypair(struct dh_keypair *s __unused, 606291e5450SJens Wiklander size_t key_size_bits __unused) 607291e5450SJens Wiklander { 608291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 609291e5450SJens Wiklander } 610291e5450SJens Wiklander 611291e5450SJens Wiklander TEE_Result crypto_acipher_gen_dh_key(struct dh_keypair *key __unused, 612291e5450SJens Wiklander struct bignum *q __unused, 613291e5450SJens Wiklander size_t xbits __unused) 614291e5450SJens Wiklander { 615291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 616291e5450SJens Wiklander } 617291e5450SJens Wiklander 618291e5450SJens Wiklander TEE_Result 619291e5450SJens Wiklander crypto_acipher_dh_shared_secret(struct dh_keypair *private_key __unused, 620291e5450SJens Wiklander struct bignum *public_key __unused, 621291e5450SJens Wiklander struct bignum *secret __unused) 622291e5450SJens Wiklander { 623291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 624291e5450SJens Wiklander } 625291e5450SJens Wiklander #endif /*!CFG_CRYPTO_DH || !_CFG_CRYPTO_WITH_ACIPHER*/ 626291e5450SJens Wiklander 627291e5450SJens Wiklander #if !defined(CFG_CRYPTO_ECC) || !defined(_CFG_CRYPTO_WITH_ACIPHER) 628291e5450SJens Wiklander TEE_Result 629291e5450SJens Wiklander crypto_acipher_alloc_ecc_public_key(struct ecc_public_key *s __unused, 630291e5450SJens Wiklander size_t key_size_bits __unused) 631291e5450SJens Wiklander { 632291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 633291e5450SJens Wiklander } 634291e5450SJens Wiklander 635291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_ecc_keypair(struct ecc_keypair *s __unused, 636291e5450SJens Wiklander size_t key_size_bits __unused) 637291e5450SJens Wiklander { 638291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 639291e5450SJens Wiklander } 640291e5450SJens Wiklander 641291e5450SJens Wiklander void crypto_acipher_free_ecc_public_key(struct ecc_public_key *s __unused) 642291e5450SJens Wiklander { 643291e5450SJens Wiklander } 644291e5450SJens Wiklander 645291e5450SJens Wiklander TEE_Result crypto_acipher_gen_ecc_key(struct ecc_keypair *key __unused) 646291e5450SJens Wiklander { 647291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 648291e5450SJens Wiklander } 649291e5450SJens Wiklander 650291e5450SJens Wiklander TEE_Result crypto_acipher_ecc_sign(uint32_t algo __unused, 651291e5450SJens Wiklander struct ecc_keypair *key __unused, 652291e5450SJens Wiklander const uint8_t *msg __unused, 653291e5450SJens Wiklander size_t msg_len __unused, 654291e5450SJens Wiklander uint8_t *sig __unused, 655291e5450SJens Wiklander size_t *sig_len __unused) 656291e5450SJens Wiklander { 657291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 658291e5450SJens Wiklander } 659291e5450SJens Wiklander 660291e5450SJens Wiklander TEE_Result crypto_acipher_ecc_verify(uint32_t algo __unused, 661291e5450SJens Wiklander struct ecc_public_key *key __unused, 662291e5450SJens Wiklander const uint8_t *msg __unused, 663291e5450SJens Wiklander size_t msg_len __unused, 664291e5450SJens Wiklander const uint8_t *sig __unused, 665291e5450SJens Wiklander size_t sig_len __unused) 666291e5450SJens Wiklander { 667291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 668291e5450SJens Wiklander } 669291e5450SJens Wiklander 670291e5450SJens Wiklander TEE_Result 671291e5450SJens Wiklander crypto_acipher_ecc_shared_secret(struct ecc_keypair *private_key __unused, 672291e5450SJens Wiklander struct ecc_public_key *public_key __unused, 673291e5450SJens Wiklander void *secret __unused, 674291e5450SJens Wiklander unsigned long *secret_len __unused) 675291e5450SJens Wiklander { 676291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 677291e5450SJens Wiklander } 678291e5450SJens Wiklander #endif /*!CFG_CRYPTO_ECC || !_CFG_CRYPTO_WITH_ACIPHER*/ 679