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; 466648f482SJens Wiklander default: 477222fc6aSCedric Neveux break; 487222fc6aSCedric Neveux } 49b887bd8fSJens Wiklander } 50b887bd8fSJens Wiklander 516648f482SJens Wiklander if (!res) 526648f482SJens Wiklander *ctx = c; 536648f482SJens Wiklander 546648f482SJens Wiklander return res; 556648f482SJens Wiklander } 566648f482SJens Wiklander 576648f482SJens Wiklander static const struct crypto_hash_ops *hash_ops(void *ctx) 586648f482SJens Wiklander { 596648f482SJens Wiklander struct crypto_hash_ctx *c = ctx; 606648f482SJens Wiklander 616648f482SJens Wiklander assert(c && c->ops); 626648f482SJens Wiklander 636648f482SJens Wiklander return c->ops; 646648f482SJens Wiklander } 656648f482SJens Wiklander 666b3a371cSJens Wiklander void crypto_hash_free_ctx(void *ctx) 67ecf2e014SJens Wiklander { 68ce7a47f5SJerome Forissier if (ctx) 696648f482SJens Wiklander hash_ops(ctx)->free_ctx(ctx); 70ecf2e014SJens Wiklander } 71ecf2e014SJens Wiklander 726b3a371cSJens Wiklander void crypto_hash_copy_state(void *dst_ctx, void *src_ctx) 73ecf2e014SJens Wiklander { 746648f482SJens Wiklander hash_ops(dst_ctx)->copy_state(dst_ctx, src_ctx); 75ecf2e014SJens Wiklander } 76ecf2e014SJens Wiklander 776b3a371cSJens Wiklander TEE_Result crypto_hash_init(void *ctx) 78b887bd8fSJens Wiklander { 796648f482SJens Wiklander return hash_ops(ctx)->init(ctx); 80b887bd8fSJens Wiklander } 816648f482SJens Wiklander 826b3a371cSJens Wiklander TEE_Result crypto_hash_update(void *ctx, const uint8_t *data, size_t len) 83b887bd8fSJens Wiklander { 846648f482SJens Wiklander return hash_ops(ctx)->update(ctx, data, len); 85b887bd8fSJens Wiklander } 866648f482SJens Wiklander 876b3a371cSJens Wiklander TEE_Result crypto_hash_final(void *ctx, uint8_t *digest, size_t len) 88b887bd8fSJens Wiklander { 896648f482SJens Wiklander return hash_ops(ctx)->final(ctx, digest, len); 90b887bd8fSJens Wiklander } 9182d91db1SJens Wiklander 9296098f01SJens Wiklander TEE_Result crypto_cipher_alloc_ctx(void **ctx, uint32_t algo) 9382d91db1SJens Wiklander { 9496098f01SJens Wiklander TEE_Result res = TEE_SUCCESS; 9596098f01SJens Wiklander struct crypto_cipher_ctx *c = NULL; 9696098f01SJens Wiklander 9796098f01SJens Wiklander switch (algo) { 9896098f01SJens Wiklander case TEE_ALG_AES_ECB_NOPAD: 9996098f01SJens Wiklander res = crypto_aes_ecb_alloc_ctx(&c); 10096098f01SJens Wiklander break; 10196098f01SJens Wiklander case TEE_ALG_AES_CBC_NOPAD: 10296098f01SJens Wiklander res = crypto_aes_cbc_alloc_ctx(&c); 10396098f01SJens Wiklander break; 10496098f01SJens Wiklander case TEE_ALG_AES_CTR: 10596098f01SJens Wiklander res = crypto_aes_ctr_alloc_ctx(&c); 10696098f01SJens Wiklander break; 10796098f01SJens Wiklander case TEE_ALG_AES_CTS: 10896098f01SJens Wiklander res = crypto_aes_cts_alloc_ctx(&c); 10996098f01SJens Wiklander break; 11096098f01SJens Wiklander case TEE_ALG_AES_XTS: 11196098f01SJens Wiklander res = crypto_aes_xts_alloc_ctx(&c); 11296098f01SJens Wiklander break; 11396098f01SJens Wiklander case TEE_ALG_DES_ECB_NOPAD: 11496098f01SJens Wiklander res = crypto_des_ecb_alloc_ctx(&c); 11596098f01SJens Wiklander break; 11696098f01SJens Wiklander case TEE_ALG_DES3_ECB_NOPAD: 11796098f01SJens Wiklander res = crypto_des3_ecb_alloc_ctx(&c); 11896098f01SJens Wiklander break; 11996098f01SJens Wiklander case TEE_ALG_DES_CBC_NOPAD: 12096098f01SJens Wiklander res = crypto_des_cbc_alloc_ctx(&c); 12196098f01SJens Wiklander break; 12296098f01SJens Wiklander case TEE_ALG_DES3_CBC_NOPAD: 12396098f01SJens Wiklander res = crypto_des3_cbc_alloc_ctx(&c); 12496098f01SJens Wiklander break; 125*ade6f848SJerome Forissier case TEE_ALG_SM4_ECB_NOPAD: 126*ade6f848SJerome Forissier res = crypto_sm4_ecb_alloc_ctx(&c); 127*ade6f848SJerome Forissier break; 128*ade6f848SJerome Forissier case TEE_ALG_SM4_CBC_NOPAD: 129*ade6f848SJerome Forissier res = crypto_sm4_cbc_alloc_ctx(&c); 130*ade6f848SJerome Forissier break; 131*ade6f848SJerome Forissier case TEE_ALG_SM4_CTR: 132*ade6f848SJerome Forissier res = crypto_sm4_ctr_alloc_ctx(&c); 133*ade6f848SJerome Forissier break; 13496098f01SJens Wiklander default: 1351c5fdd1fSJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED; 13682d91db1SJens Wiklander } 13782d91db1SJens Wiklander 13896098f01SJens Wiklander if (!res) 13996098f01SJens Wiklander *ctx = c; 14096098f01SJens Wiklander 14196098f01SJens Wiklander return res; 14296098f01SJens Wiklander } 14396098f01SJens Wiklander 14496098f01SJens Wiklander static const struct crypto_cipher_ops *cipher_ops(void *ctx) 14596098f01SJens Wiklander { 14696098f01SJens Wiklander struct crypto_cipher_ctx *c = ctx; 14796098f01SJens Wiklander 14896098f01SJens Wiklander assert(c && c->ops); 14996098f01SJens Wiklander 15096098f01SJens Wiklander return c->ops; 15196098f01SJens Wiklander } 15296098f01SJens Wiklander 153cbda7091SJens Wiklander void crypto_cipher_free_ctx(void *ctx) 15472a9b1a0SJens Wiklander { 155ce7a47f5SJerome Forissier if (ctx) 15696098f01SJens Wiklander cipher_ops(ctx)->free_ctx(ctx); 15772a9b1a0SJens Wiklander } 15872a9b1a0SJens Wiklander 159cbda7091SJens Wiklander void crypto_cipher_copy_state(void *dst_ctx, void *src_ctx) 16072a9b1a0SJens Wiklander { 16196098f01SJens Wiklander cipher_ops(dst_ctx)->copy_state(dst_ctx, src_ctx); 16272a9b1a0SJens Wiklander } 16372a9b1a0SJens Wiklander 164cbda7091SJens Wiklander TEE_Result crypto_cipher_init(void *ctx, TEE_OperationMode mode, 165cbda7091SJens Wiklander const uint8_t *key1, size_t key1_len, 166cbda7091SJens Wiklander const uint8_t *key2, size_t key2_len, 167cbda7091SJens Wiklander const uint8_t *iv, size_t iv_len) 16882d91db1SJens Wiklander { 16996098f01SJens Wiklander if (mode != TEE_MODE_DECRYPT && mode != TEE_MODE_ENCRYPT) 17096098f01SJens Wiklander return TEE_ERROR_BAD_PARAMETERS; 17196098f01SJens Wiklander 17296098f01SJens Wiklander return cipher_ops(ctx)->init(ctx, mode, key1, key1_len, key2, key2_len, 17396098f01SJens Wiklander iv, iv_len); 17482d91db1SJens Wiklander } 17582d91db1SJens Wiklander 176cbda7091SJens Wiklander TEE_Result crypto_cipher_update(void *ctx, TEE_OperationMode mode __unused, 17796098f01SJens Wiklander bool last_block, const uint8_t *data, 17896098f01SJens Wiklander size_t len, uint8_t *dst) 17982d91db1SJens Wiklander { 18096098f01SJens Wiklander return cipher_ops(ctx)->update(ctx, last_block, data, len, dst); 18182d91db1SJens Wiklander } 18282d91db1SJens Wiklander 183cbda7091SJens Wiklander void crypto_cipher_final(void *ctx) 18482d91db1SJens Wiklander { 18596098f01SJens Wiklander cipher_ops(ctx)->final(ctx); 18682d91db1SJens Wiklander } 187e9eaba5cSJens Wiklander 1886d259e05SJens Wiklander TEE_Result crypto_cipher_get_block_size(uint32_t algo, size_t *size) 1896d259e05SJens Wiklander { 1906d259e05SJens Wiklander uint32_t class = TEE_ALG_GET_CLASS(algo); 1916d259e05SJens Wiklander 1926d259e05SJens Wiklander if (class != TEE_OPERATION_CIPHER && class != TEE_OPERATION_MAC && 1936d259e05SJens Wiklander class != TEE_OPERATION_AE) 1946d259e05SJens Wiklander return TEE_ERROR_BAD_PARAMETERS; 1956d259e05SJens Wiklander 1966d259e05SJens Wiklander switch (TEE_ALG_GET_MAIN_ALG(algo)) { 1976d259e05SJens Wiklander case TEE_MAIN_ALGO_AES: 1986d259e05SJens Wiklander *size = TEE_AES_BLOCK_SIZE; 1996d259e05SJens Wiklander return TEE_SUCCESS; 2006d259e05SJens Wiklander case TEE_MAIN_ALGO_DES: 2016d259e05SJens Wiklander case TEE_MAIN_ALGO_DES3: 2026d259e05SJens Wiklander *size = TEE_DES_BLOCK_SIZE; 2036d259e05SJens Wiklander return TEE_SUCCESS; 204*ade6f848SJerome Forissier case TEE_MAIN_ALGO_SM4: 205*ade6f848SJerome Forissier *size = TEE_SM4_BLOCK_SIZE; 206*ade6f848SJerome Forissier return TEE_SUCCESS; 2076d259e05SJens Wiklander default: 2086d259e05SJens Wiklander return TEE_ERROR_NOT_SUPPORTED; 2096d259e05SJens Wiklander } 2106d259e05SJens Wiklander } 2116d259e05SJens Wiklander 2125da36a24SJens Wiklander TEE_Result crypto_mac_alloc_ctx(void **ctx, uint32_t algo) 213e9eaba5cSJens Wiklander { 2145da36a24SJens Wiklander TEE_Result res = TEE_SUCCESS; 2155da36a24SJens Wiklander struct crypto_mac_ctx *c = NULL; 2165da36a24SJens Wiklander 2175da36a24SJens Wiklander switch (algo) { 2185da36a24SJens Wiklander case TEE_ALG_HMAC_MD5: 2195da36a24SJens Wiklander res = crypto_hmac_md5_alloc_ctx(&c); 2205da36a24SJens Wiklander break; 2215da36a24SJens Wiklander case TEE_ALG_HMAC_SHA1: 2225da36a24SJens Wiklander res = crypto_hmac_sha1_alloc_ctx(&c); 2235da36a24SJens Wiklander break; 2245da36a24SJens Wiklander case TEE_ALG_HMAC_SHA224: 2255da36a24SJens Wiklander res = crypto_hmac_sha224_alloc_ctx(&c); 2265da36a24SJens Wiklander break; 2275da36a24SJens Wiklander case TEE_ALG_HMAC_SHA256: 2285da36a24SJens Wiklander res = crypto_hmac_sha256_alloc_ctx(&c); 2295da36a24SJens Wiklander break; 2305da36a24SJens Wiklander case TEE_ALG_HMAC_SHA384: 2315da36a24SJens Wiklander res = crypto_hmac_sha384_alloc_ctx(&c); 2325da36a24SJens Wiklander break; 2335da36a24SJens Wiklander case TEE_ALG_HMAC_SHA512: 2345da36a24SJens Wiklander res = crypto_hmac_sha512_alloc_ctx(&c); 2355da36a24SJens Wiklander break; 2365da36a24SJens Wiklander case TEE_ALG_AES_CBC_MAC_NOPAD: 2375da36a24SJens Wiklander res = crypto_aes_cbc_mac_nopad_alloc_ctx(&c); 2385da36a24SJens Wiklander break; 2395da36a24SJens Wiklander case TEE_ALG_AES_CBC_MAC_PKCS5: 2405da36a24SJens Wiklander res = crypto_aes_cbc_mac_pkcs5_alloc_ctx(&c); 2415da36a24SJens Wiklander break; 2425da36a24SJens Wiklander case TEE_ALG_DES_CBC_MAC_NOPAD: 2435da36a24SJens Wiklander res = crypto_des_cbc_mac_nopad_alloc_ctx(&c); 2445da36a24SJens Wiklander break; 2455da36a24SJens Wiklander case TEE_ALG_DES_CBC_MAC_PKCS5: 2465da36a24SJens Wiklander res = crypto_des_cbc_mac_pkcs5_alloc_ctx(&c); 2475da36a24SJens Wiklander break; 2485da36a24SJens Wiklander case TEE_ALG_DES3_CBC_MAC_NOPAD: 2495da36a24SJens Wiklander res = crypto_des3_cbc_mac_nopad_alloc_ctx(&c); 2505da36a24SJens Wiklander break; 2515da36a24SJens Wiklander case TEE_ALG_DES3_CBC_MAC_PKCS5: 2525da36a24SJens Wiklander res = crypto_des3_cbc_mac_pkcs5_alloc_ctx(&c); 2535da36a24SJens Wiklander break; 2545da36a24SJens Wiklander case TEE_ALG_AES_CMAC: 2555da36a24SJens Wiklander res = crypto_aes_cmac_alloc_ctx(&c); 2565da36a24SJens Wiklander break; 2575da36a24SJens Wiklander default: 2585da36a24SJens Wiklander return TEE_ERROR_NOT_SUPPORTED; 2595da36a24SJens Wiklander } 2605da36a24SJens Wiklander 2615da36a24SJens Wiklander if (!res) 2625da36a24SJens Wiklander *ctx = c; 2635da36a24SJens Wiklander 2645da36a24SJens Wiklander return res; 2655da36a24SJens Wiklander } 2665da36a24SJens Wiklander 2675da36a24SJens Wiklander static const struct crypto_mac_ops *mac_ops(void *ctx) 2685da36a24SJens Wiklander { 2695da36a24SJens Wiklander struct crypto_mac_ctx *c = ctx; 2705da36a24SJens Wiklander 2715da36a24SJens Wiklander assert(c && c->ops); 2725da36a24SJens Wiklander 2735da36a24SJens Wiklander return c->ops; 274e9eaba5cSJens Wiklander } 275e9eaba5cSJens Wiklander 276c69bc615SJens Wiklander void crypto_mac_free_ctx(void *ctx) 27782ef73bcSJens Wiklander { 278ce7a47f5SJerome Forissier if (ctx) 2795da36a24SJens Wiklander mac_ops(ctx)->free_ctx(ctx); 28082ef73bcSJens Wiklander } 28182ef73bcSJens Wiklander 282c69bc615SJens Wiklander void crypto_mac_copy_state(void *dst_ctx, void *src_ctx) 28382ef73bcSJens Wiklander { 2845da36a24SJens Wiklander mac_ops(dst_ctx)->copy_state(dst_ctx, src_ctx); 28582ef73bcSJens Wiklander } 28682ef73bcSJens Wiklander 287c69bc615SJens Wiklander TEE_Result crypto_mac_init(void *ctx, const uint8_t *key, size_t len) 288e9eaba5cSJens Wiklander { 2895da36a24SJens Wiklander return mac_ops(ctx)->init(ctx, key, len); 290e9eaba5cSJens Wiklander } 291e9eaba5cSJens Wiklander 292c69bc615SJens Wiklander TEE_Result crypto_mac_update(void *ctx, const uint8_t *data, size_t len) 293e9eaba5cSJens Wiklander { 2945da36a24SJens Wiklander if (!len) 2955da36a24SJens Wiklander return TEE_SUCCESS; 2965da36a24SJens Wiklander 2975da36a24SJens Wiklander return mac_ops(ctx)->update(ctx, data, len); 298e9eaba5cSJens Wiklander } 299e9eaba5cSJens Wiklander 300c69bc615SJens Wiklander TEE_Result crypto_mac_final(void *ctx, uint8_t *digest, size_t digest_len) 301e9eaba5cSJens Wiklander { 3025da36a24SJens Wiklander return mac_ops(ctx)->final(ctx, digest, digest_len); 303e9eaba5cSJens Wiklander } 304e9eaba5cSJens Wiklander 305d7ac7d0fSJens Wiklander TEE_Result crypto_authenc_alloc_ctx(void **ctx, uint32_t algo) 3068875ce46SJens Wiklander { 307f1e9b21bSJens Wiklander TEE_Result res = TEE_SUCCESS; 308f1e9b21bSJens Wiklander struct crypto_authenc_ctx *c = NULL; 309f1e9b21bSJens Wiklander 310d0620b01SJens Wiklander switch (algo) { 311d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM) 312d0620b01SJens Wiklander case TEE_ALG_AES_CCM: 313f1e9b21bSJens Wiklander res = crypto_aes_ccm_alloc_ctx(&c); 314f1e9b21bSJens Wiklander break; 315d0620b01SJens Wiklander #endif 316d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM) 317d0620b01SJens Wiklander case TEE_ALG_AES_GCM: 318f1e9b21bSJens Wiklander res = crypto_aes_gcm_alloc_ctx(&c); 319f1e9b21bSJens Wiklander break; 320d0620b01SJens Wiklander #endif 321d0620b01SJens Wiklander default: 3228875ce46SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 3238875ce46SJens Wiklander } 324f1e9b21bSJens Wiklander 325f1e9b21bSJens Wiklander if (!res) 326f1e9b21bSJens Wiklander *ctx = c; 327f1e9b21bSJens Wiklander 328f1e9b21bSJens Wiklander return res; 329d0620b01SJens Wiklander } 3308875ce46SJens Wiklander 331f1e9b21bSJens Wiklander static const struct crypto_authenc_ops *ae_ops(void *ctx) 332d7ac7d0fSJens Wiklander { 333f1e9b21bSJens Wiklander struct crypto_authenc_ctx *c = ctx; 334f1e9b21bSJens Wiklander 335f1e9b21bSJens Wiklander assert(c && c->ops); 336f1e9b21bSJens Wiklander 337f1e9b21bSJens Wiklander return c->ops; 338d7ac7d0fSJens Wiklander } 339d7ac7d0fSJens Wiklander 34052ee414bSJens Wiklander TEE_Result crypto_authenc_init(void *ctx, TEE_OperationMode mode, 341f1e9b21bSJens Wiklander const uint8_t *key, size_t key_len, 342f1e9b21bSJens Wiklander const uint8_t *nonce, size_t nonce_len, 343f1e9b21bSJens Wiklander size_t tag_len, size_t aad_len, 344f1e9b21bSJens Wiklander size_t payload_len) 345d7ac7d0fSJens Wiklander { 346f1e9b21bSJens Wiklander return ae_ops(ctx)->init(ctx, mode, key, key_len, nonce, nonce_len, 347f1e9b21bSJens Wiklander tag_len, aad_len, payload_len); 348d7ac7d0fSJens Wiklander } 349d7ac7d0fSJens Wiklander 35052ee414bSJens Wiklander TEE_Result crypto_authenc_update_aad(void *ctx, TEE_OperationMode mode __unused, 351f1e9b21bSJens Wiklander const uint8_t *data, size_t len) 3528875ce46SJens Wiklander { 353f1e9b21bSJens Wiklander return ae_ops(ctx)->update_aad(ctx, data, len); 354d0620b01SJens Wiklander } 3558875ce46SJens Wiklander 356d0620b01SJens Wiklander 35752ee414bSJens Wiklander TEE_Result crypto_authenc_update_payload(void *ctx, TEE_OperationMode mode, 358f1e9b21bSJens Wiklander const uint8_t *src_data, 359f1e9b21bSJens Wiklander size_t src_len, uint8_t *dst_data, 360f1e9b21bSJens Wiklander size_t *dst_len) 361f1e9b21bSJens Wiklander { 362f1e9b21bSJens Wiklander if (*dst_len < src_len) 363d0620b01SJens Wiklander return TEE_ERROR_SHORT_BUFFER; 364d0620b01SJens Wiklander *dst_len = src_len; 365d0620b01SJens Wiklander 366f1e9b21bSJens Wiklander return ae_ops(ctx)->update_payload(ctx, mode, src_data, src_len, 367f1e9b21bSJens Wiklander dst_data); 368d0620b01SJens Wiklander } 3698875ce46SJens Wiklander 37052ee414bSJens Wiklander TEE_Result crypto_authenc_enc_final(void *ctx, const uint8_t *src_data, 37152ee414bSJens Wiklander size_t src_len, uint8_t *dst_data, 37252ee414bSJens Wiklander size_t *dst_len, uint8_t *dst_tag, 37352ee414bSJens Wiklander size_t *dst_tag_len) 3748875ce46SJens Wiklander { 375f1e9b21bSJens Wiklander if (*dst_len < src_len) 376f1e9b21bSJens Wiklander return TEE_ERROR_SHORT_BUFFER; 377d0620b01SJens Wiklander *dst_len = src_len; 378d0620b01SJens Wiklander 379f1e9b21bSJens Wiklander return ae_ops(ctx)->enc_final(ctx, src_data, src_len, dst_data, 380f1e9b21bSJens Wiklander dst_tag, dst_tag_len); 3818875ce46SJens Wiklander } 3828875ce46SJens Wiklander 38352ee414bSJens Wiklander TEE_Result crypto_authenc_dec_final(void *ctx, const uint8_t *src_data, 38452ee414bSJens Wiklander size_t src_len, uint8_t *dst_data, 38552ee414bSJens Wiklander size_t *dst_len, const uint8_t *tag, 38652ee414bSJens Wiklander size_t tag_len) 3878875ce46SJens Wiklander { 388f1e9b21bSJens Wiklander if (*dst_len < src_len) 389f1e9b21bSJens Wiklander return TEE_ERROR_SHORT_BUFFER; 390f1e9b21bSJens Wiklander *dst_len = src_len; 391f1e9b21bSJens Wiklander 392f1e9b21bSJens Wiklander return ae_ops(ctx)->dec_final(ctx, src_data, src_len, dst_data, tag, 393f1e9b21bSJens Wiklander tag_len); 3948875ce46SJens Wiklander } 395f1e9b21bSJens Wiklander 39652ee414bSJens Wiklander void crypto_authenc_final(void *ctx) 397f1e9b21bSJens Wiklander { 398f1e9b21bSJens Wiklander ae_ops(ctx)->final(ctx); 399f1e9b21bSJens Wiklander } 400f1e9b21bSJens Wiklander 40152ee414bSJens Wiklander void crypto_authenc_free_ctx(void *ctx) 402f1e9b21bSJens Wiklander { 403f1e9b21bSJens Wiklander if (ctx) 404f1e9b21bSJens Wiklander ae_ops(ctx)->free_ctx(ctx); 405f1e9b21bSJens Wiklander } 406f1e9b21bSJens Wiklander 40752ee414bSJens Wiklander void crypto_authenc_copy_state(void *dst_ctx, void *src_ctx) 408f1e9b21bSJens Wiklander { 409f1e9b21bSJens Wiklander ae_ops(dst_ctx)->copy_state(dst_ctx, src_ctx); 410d0620b01SJens Wiklander } 41133790cc1SJens Wiklander 412da1de557SJens Wiklander #if !defined(CFG_CRYPTO_RSA) && !defined(CFG_CRYPTO_DSA) && \ 413da1de557SJens Wiklander !defined(CFG_CRYPTO_DH) && !defined(CFG_CRYPTO_ECC) 41433790cc1SJens Wiklander struct bignum *crypto_bignum_allocate(size_t size_bits __unused) 41533790cc1SJens Wiklander { 41633790cc1SJens Wiklander return NULL; 41733790cc1SJens Wiklander } 41833790cc1SJens Wiklander 41933790cc1SJens Wiklander TEE_Result crypto_bignum_bin2bn(const uint8_t *from __unused, 42033790cc1SJens Wiklander size_t fromsize __unused, 42133790cc1SJens Wiklander struct bignum *to __unused) 42233790cc1SJens Wiklander { 42333790cc1SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 42433790cc1SJens Wiklander } 42533790cc1SJens Wiklander 42633790cc1SJens Wiklander size_t crypto_bignum_num_bytes(struct bignum *a __unused) 42733790cc1SJens Wiklander { 42833790cc1SJens Wiklander return 0; 42933790cc1SJens Wiklander } 43033790cc1SJens Wiklander 43133790cc1SJens Wiklander size_t crypto_bignum_num_bits(struct bignum *a __unused) 43233790cc1SJens Wiklander { 43333790cc1SJens Wiklander return 0; 43433790cc1SJens Wiklander } 43533790cc1SJens Wiklander 43633790cc1SJens Wiklander /* 43733790cc1SJens Wiklander * crypto_bignum_allocate() and crypto_bignum_bin2bn() failing should be 43833790cc1SJens Wiklander * enough to guarantee that the functions calling this function aren't 43933790cc1SJens Wiklander * called, but just in case add a panic() here to avoid unexpected 44033790cc1SJens Wiklander * behavoir. 44133790cc1SJens Wiklander */ 44233790cc1SJens Wiklander static void bignum_cant_happen(void) 44333790cc1SJens Wiklander { 44433790cc1SJens Wiklander volatile bool b = true; 44533790cc1SJens Wiklander 44633790cc1SJens Wiklander /* Avoid warning about function does not return */ 44733790cc1SJens Wiklander if (b) 44833790cc1SJens Wiklander panic(); 44933790cc1SJens Wiklander } 45033790cc1SJens Wiklander 45133790cc1SJens Wiklander void crypto_bignum_bn2bin(const struct bignum *from __unused, 45233790cc1SJens Wiklander uint8_t *to __unused) 45333790cc1SJens Wiklander { 45433790cc1SJens Wiklander bignum_cant_happen(); 45533790cc1SJens Wiklander } 45633790cc1SJens Wiklander 45733790cc1SJens Wiklander void crypto_bignum_copy(struct bignum *to __unused, 45833790cc1SJens Wiklander const struct bignum *from __unused) 45933790cc1SJens Wiklander { 46033790cc1SJens Wiklander bignum_cant_happen(); 46133790cc1SJens Wiklander } 46233790cc1SJens Wiklander 46333790cc1SJens Wiklander void crypto_bignum_free(struct bignum *a) 46433790cc1SJens Wiklander { 46533790cc1SJens Wiklander if (a) 46633790cc1SJens Wiklander panic(); 46733790cc1SJens Wiklander } 46833790cc1SJens Wiklander 46933790cc1SJens Wiklander void crypto_bignum_clear(struct bignum *a __unused) 47033790cc1SJens Wiklander { 47133790cc1SJens Wiklander bignum_cant_happen(); 47233790cc1SJens Wiklander } 47333790cc1SJens Wiklander 47433790cc1SJens Wiklander /* return -1 if a<b, 0 if a==b, +1 if a>b */ 47533790cc1SJens Wiklander int32_t crypto_bignum_compare(struct bignum *a __unused, 47633790cc1SJens Wiklander struct bignum *b __unused) 47733790cc1SJens Wiklander { 47833790cc1SJens Wiklander bignum_cant_happen(); 47933790cc1SJens Wiklander return -1; 48033790cc1SJens Wiklander } 481da1de557SJens Wiklander #endif 482291e5450SJens Wiklander 483da1de557SJens Wiklander #if !defined(CFG_CRYPTO_RSA) 484291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_rsa_keypair(struct rsa_keypair *s __unused, 485291e5450SJens Wiklander size_t key_size_bits __unused) 486291e5450SJens Wiklander { 487291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 488291e5450SJens Wiklander } 489291e5450SJens Wiklander 490291e5450SJens Wiklander TEE_Result 491291e5450SJens Wiklander crypto_acipher_alloc_rsa_public_key(struct rsa_public_key *s __unused, 492291e5450SJens Wiklander size_t key_size_bits __unused) 493291e5450SJens Wiklander { 494291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 495291e5450SJens Wiklander } 496291e5450SJens Wiklander 497291e5450SJens Wiklander void crypto_acipher_free_rsa_public_key(struct rsa_public_key *s __unused) 498291e5450SJens Wiklander { 499291e5450SJens Wiklander } 500291e5450SJens Wiklander 501291e5450SJens Wiklander TEE_Result crypto_acipher_gen_rsa_key(struct rsa_keypair *key __unused, 502291e5450SJens Wiklander size_t key_size __unused) 503291e5450SJens Wiklander { 504291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 505291e5450SJens Wiklander } 506291e5450SJens Wiklander 507291e5450SJens Wiklander TEE_Result crypto_acipher_rsanopad_decrypt(struct rsa_keypair *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_rsanopad_encrypt(struct rsa_public_key *key __unused, 517291e5450SJens Wiklander const uint8_t *src __unused, 518291e5450SJens Wiklander size_t src_len __unused, 519291e5450SJens Wiklander uint8_t *dst __unused, 520291e5450SJens Wiklander size_t *dst_len __unused) 521291e5450SJens Wiklander { 522291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 523291e5450SJens Wiklander } 524291e5450SJens Wiklander 525291e5450SJens Wiklander TEE_Result crypto_acipher_rsaes_decrypt(uint32_t algo __unused, 526291e5450SJens Wiklander struct rsa_keypair *key __unused, 527291e5450SJens Wiklander const uint8_t *label __unused, 528291e5450SJens Wiklander size_t label_len __unused, 529291e5450SJens Wiklander const uint8_t *src __unused, 530291e5450SJens Wiklander size_t src_len __unused, 531291e5450SJens Wiklander uint8_t *dst __unused, 532291e5450SJens Wiklander size_t *dst_len __unused) 533291e5450SJens Wiklander { 534291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 535291e5450SJens Wiklander } 536291e5450SJens Wiklander 537291e5450SJens Wiklander TEE_Result crypto_acipher_rsaes_encrypt(uint32_t algo __unused, 538291e5450SJens Wiklander struct rsa_public_key *key __unused, 539291e5450SJens Wiklander const uint8_t *label __unused, 540291e5450SJens Wiklander size_t label_len __unused, 541291e5450SJens Wiklander const uint8_t *src __unused, 542291e5450SJens Wiklander size_t src_len __unused, 543291e5450SJens Wiklander uint8_t *dst __unused, 544291e5450SJens Wiklander size_t *dst_len __unused) 545291e5450SJens Wiklander { 546291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 547291e5450SJens Wiklander } 548291e5450SJens Wiklander 549291e5450SJens Wiklander TEE_Result crypto_acipher_rsassa_sign(uint32_t algo __unused, 550291e5450SJens Wiklander struct rsa_keypair *key __unused, 551291e5450SJens Wiklander int salt_len __unused, 552291e5450SJens Wiklander const uint8_t *msg __unused, 553291e5450SJens Wiklander size_t msg_len __unused, 554291e5450SJens Wiklander uint8_t *sig __unused, 555291e5450SJens Wiklander size_t *sig_len __unused) 556291e5450SJens Wiklander { 557291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 558291e5450SJens Wiklander } 559291e5450SJens Wiklander 560291e5450SJens Wiklander TEE_Result crypto_acipher_rsassa_verify(uint32_t algo __unused, 561291e5450SJens Wiklander struct rsa_public_key *key __unused, 562291e5450SJens Wiklander int salt_len __unused, 563291e5450SJens Wiklander const uint8_t *msg __unused, 564291e5450SJens Wiklander size_t msg_len __unused, 565291e5450SJens Wiklander const uint8_t *sig __unused, 566291e5450SJens Wiklander size_t sig_len __unused) 567291e5450SJens Wiklander { 568291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 569291e5450SJens Wiklander } 570da1de557SJens Wiklander #endif /*!CFG_CRYPTO_RSA*/ 571291e5450SJens Wiklander 572da1de557SJens Wiklander #if !defined(CFG_CRYPTO_DSA) 573291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_dsa_keypair(struct dsa_keypair *s __unused, 574291e5450SJens Wiklander size_t key_size_bits __unused) 575291e5450SJens Wiklander { 576291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 577291e5450SJens Wiklander } 578291e5450SJens Wiklander 579291e5450SJens Wiklander TEE_Result 580291e5450SJens Wiklander crypto_acipher_alloc_dsa_public_key(struct dsa_public_key *s __unused, 581291e5450SJens Wiklander size_t key_size_bits __unused) 582291e5450SJens Wiklander { 583291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 584291e5450SJens Wiklander } 585291e5450SJens Wiklander 586291e5450SJens Wiklander TEE_Result crypto_acipher_gen_dsa_key(struct dsa_keypair *key __unused, 587291e5450SJens Wiklander size_t key_size __unused) 588291e5450SJens Wiklander { 589291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 590291e5450SJens Wiklander } 591291e5450SJens Wiklander 592291e5450SJens Wiklander TEE_Result crypto_acipher_dsa_sign(uint32_t algo __unused, 593291e5450SJens Wiklander struct dsa_keypair *key __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_dsa_verify(uint32_t algo __unused, 603291e5450SJens Wiklander struct dsa_public_key *key __unused, 604291e5450SJens Wiklander const uint8_t *msg __unused, 605291e5450SJens Wiklander size_t msg_len __unused, 606291e5450SJens Wiklander const uint8_t *sig __unused, 607291e5450SJens Wiklander size_t sig_len __unused) 608291e5450SJens Wiklander { 609291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 610291e5450SJens Wiklander } 611da1de557SJens Wiklander #endif /*!CFG_CRYPTO_DSA*/ 612291e5450SJens Wiklander 613da1de557SJens Wiklander #if !defined(CFG_CRYPTO_DH) 614291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_dh_keypair(struct dh_keypair *s __unused, 615291e5450SJens Wiklander size_t key_size_bits __unused) 616291e5450SJens Wiklander { 617291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 618291e5450SJens Wiklander } 619291e5450SJens Wiklander 620291e5450SJens Wiklander TEE_Result crypto_acipher_gen_dh_key(struct dh_keypair *key __unused, 621291e5450SJens Wiklander struct bignum *q __unused, 622291e5450SJens Wiklander size_t xbits __unused) 623291e5450SJens Wiklander { 624291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 625291e5450SJens Wiklander } 626291e5450SJens Wiklander 627291e5450SJens Wiklander TEE_Result 628291e5450SJens Wiklander crypto_acipher_dh_shared_secret(struct dh_keypair *private_key __unused, 629291e5450SJens Wiklander struct bignum *public_key __unused, 630291e5450SJens Wiklander struct bignum *secret __unused) 631291e5450SJens Wiklander { 632291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 633291e5450SJens Wiklander } 634da1de557SJens Wiklander #endif /*!CFG_CRYPTO_DH*/ 635291e5450SJens Wiklander 636da1de557SJens Wiklander #if !defined(CFG_CRYPTO_ECC) 637291e5450SJens Wiklander TEE_Result 638291e5450SJens Wiklander crypto_acipher_alloc_ecc_public_key(struct ecc_public_key *s __unused, 639291e5450SJens Wiklander size_t key_size_bits __unused) 640291e5450SJens Wiklander { 641291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 642291e5450SJens Wiklander } 643291e5450SJens Wiklander 644291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_ecc_keypair(struct ecc_keypair *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 void crypto_acipher_free_ecc_public_key(struct ecc_public_key *s __unused) 651291e5450SJens Wiklander { 652291e5450SJens Wiklander } 653291e5450SJens Wiklander 654291e5450SJens Wiklander TEE_Result crypto_acipher_gen_ecc_key(struct ecc_keypair *key __unused) 655291e5450SJens Wiklander { 656291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 657291e5450SJens Wiklander } 658291e5450SJens Wiklander 659291e5450SJens Wiklander TEE_Result crypto_acipher_ecc_sign(uint32_t algo __unused, 660291e5450SJens Wiklander struct ecc_keypair *key __unused, 661291e5450SJens Wiklander const uint8_t *msg __unused, 662291e5450SJens Wiklander size_t msg_len __unused, 663291e5450SJens Wiklander uint8_t *sig __unused, 664291e5450SJens Wiklander size_t *sig_len __unused) 665291e5450SJens Wiklander { 666291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 667291e5450SJens Wiklander } 668291e5450SJens Wiklander 669291e5450SJens Wiklander TEE_Result crypto_acipher_ecc_verify(uint32_t algo __unused, 670291e5450SJens Wiklander struct ecc_public_key *key __unused, 671291e5450SJens Wiklander const uint8_t *msg __unused, 672291e5450SJens Wiklander size_t msg_len __unused, 673291e5450SJens Wiklander const uint8_t *sig __unused, 674291e5450SJens Wiklander size_t sig_len __unused) 675291e5450SJens Wiklander { 676291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 677291e5450SJens Wiklander } 678291e5450SJens Wiklander 679291e5450SJens Wiklander TEE_Result 680291e5450SJens Wiklander crypto_acipher_ecc_shared_secret(struct ecc_keypair *private_key __unused, 681291e5450SJens Wiklander struct ecc_public_key *public_key __unused, 682291e5450SJens Wiklander void *secret __unused, 683291e5450SJens Wiklander unsigned long *secret_len __unused) 684291e5450SJens Wiklander { 685291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 686291e5450SJens Wiklander } 687da1de557SJens Wiklander #endif /*!CFG_CRYPTO_ECC*/ 688