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> 8d0620b01SJens Wiklander #include <crypto/aes-ccm.h> 9d0620b01SJens Wiklander #include <crypto/aes-gcm.h> 10e1770e71SJens Wiklander #include <crypto/crypto.h> 116648f482SJens Wiklander #include <crypto/crypto_impl.h> 1233790cc1SJens Wiklander #include <kernel/panic.h> 13d7ac7d0fSJens Wiklander #include <stdlib.h> 14d7ac7d0fSJens Wiklander #include <string.h> 156d259e05SJens Wiklander #include <utee_defines.h> 16b887bd8fSJens Wiklander 176648f482SJens Wiklander TEE_Result crypto_hash_alloc_ctx(void **ctx, uint32_t algo) 18b887bd8fSJens Wiklander { 196648f482SJens Wiklander TEE_Result res = TEE_SUCCESS; 206648f482SJens Wiklander struct crypto_hash_ctx *c = NULL; 216648f482SJens Wiklander 226648f482SJens Wiklander switch (algo) { 236648f482SJens Wiklander case TEE_ALG_MD5: 246648f482SJens Wiklander res = crypto_md5_alloc_ctx(&c); 256648f482SJens Wiklander break; 266648f482SJens Wiklander case TEE_ALG_SHA1: 276648f482SJens Wiklander res = crypto_sha1_alloc_ctx(&c); 286648f482SJens Wiklander break; 296648f482SJens Wiklander case TEE_ALG_SHA224: 306648f482SJens Wiklander res = crypto_sha224_alloc_ctx(&c); 316648f482SJens Wiklander break; 326648f482SJens Wiklander case TEE_ALG_SHA256: 336648f482SJens Wiklander res = crypto_sha256_alloc_ctx(&c); 346648f482SJens Wiklander break; 356648f482SJens Wiklander case TEE_ALG_SHA384: 366648f482SJens Wiklander res = crypto_sha384_alloc_ctx(&c); 376648f482SJens Wiklander break; 386648f482SJens Wiklander case TEE_ALG_SHA512: 396648f482SJens Wiklander res = crypto_sha512_alloc_ctx(&c); 406648f482SJens Wiklander break; 416648f482SJens Wiklander default: 42b887bd8fSJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 43b887bd8fSJens Wiklander } 44b887bd8fSJens Wiklander 456648f482SJens Wiklander if (!res) 466648f482SJens Wiklander *ctx = c; 476648f482SJens Wiklander 486648f482SJens Wiklander return res; 496648f482SJens Wiklander } 506648f482SJens Wiklander 516648f482SJens Wiklander static const struct crypto_hash_ops *hash_ops(void *ctx) 526648f482SJens Wiklander { 536648f482SJens Wiklander struct crypto_hash_ctx *c = ctx; 546648f482SJens Wiklander 556648f482SJens Wiklander assert(c && c->ops); 566648f482SJens Wiklander 576648f482SJens Wiklander return c->ops; 586648f482SJens Wiklander } 596648f482SJens Wiklander 60ce7a47f5SJerome Forissier void crypto_hash_free_ctx(void *ctx, uint32_t algo __unused) 61ecf2e014SJens Wiklander { 62ce7a47f5SJerome Forissier if (ctx) 636648f482SJens Wiklander hash_ops(ctx)->free_ctx(ctx); 64ecf2e014SJens Wiklander } 65ecf2e014SJens Wiklander 666648f482SJens Wiklander void crypto_hash_copy_state(void *dst_ctx, void *src_ctx, 67ecf2e014SJens Wiklander uint32_t algo __unused) 68ecf2e014SJens Wiklander { 696648f482SJens Wiklander hash_ops(dst_ctx)->copy_state(dst_ctx, src_ctx); 70ecf2e014SJens Wiklander } 71ecf2e014SJens Wiklander 726648f482SJens Wiklander TEE_Result crypto_hash_init(void *ctx, uint32_t algo __unused) 73b887bd8fSJens Wiklander { 746648f482SJens Wiklander return hash_ops(ctx)->init(ctx); 75b887bd8fSJens Wiklander } 766648f482SJens Wiklander 776648f482SJens Wiklander TEE_Result crypto_hash_update(void *ctx, uint32_t algo __unused, 786648f482SJens Wiklander const uint8_t *data, size_t len) 79b887bd8fSJens Wiklander { 806648f482SJens Wiklander return hash_ops(ctx)->update(ctx, data, len); 81b887bd8fSJens Wiklander } 826648f482SJens Wiklander 836648f482SJens Wiklander TEE_Result crypto_hash_final(void *ctx, uint32_t algo __unused, 846648f482SJens Wiklander uint8_t *digest, size_t len) 85b887bd8fSJens Wiklander { 866648f482SJens Wiklander return hash_ops(ctx)->final(ctx, digest, len); 87b887bd8fSJens Wiklander } 8882d91db1SJens Wiklander 8982d91db1SJens Wiklander #if !defined(_CFG_CRYPTO_WITH_CIPHER) 9072a9b1a0SJens Wiklander TEE_Result crypto_cipher_alloc_ctx(void **ctx __unused, uint32_t algo __unused) 9182d91db1SJens Wiklander { 921c5fdd1fSJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED; 9382d91db1SJens Wiklander } 9482d91db1SJens Wiklander 95ce7a47f5SJerome Forissier void crypto_cipher_free_ctx(void *ctx, uint32_t algo __unused) 9672a9b1a0SJens Wiklander { 97ce7a47f5SJerome Forissier if (ctx) 9872a9b1a0SJens Wiklander assert(0); 9972a9b1a0SJens Wiklander } 10072a9b1a0SJens Wiklander 10172a9b1a0SJens Wiklander void crypto_cipher_copy_state(void *dst_ctx __unused, void *src_ctx __unused, 10272a9b1a0SJens Wiklander uint32_t algo __unused) 10372a9b1a0SJens Wiklander { 10472a9b1a0SJens Wiklander assert(0); 10572a9b1a0SJens Wiklander } 10672a9b1a0SJens Wiklander 10782d91db1SJens Wiklander TEE_Result crypto_cipher_init(void *ctx __unused, uint32_t algo __unused, 10882d91db1SJens Wiklander TEE_OperationMode mode __unused, 10982d91db1SJens Wiklander const uint8_t *key1 __unused, 11082d91db1SJens Wiklander size_t key1_len __unused, 11182d91db1SJens Wiklander const uint8_t *key2 __unused, 11282d91db1SJens Wiklander size_t key2_len __unused, 11382d91db1SJens Wiklander const uint8_t *iv __unused, 11482d91db1SJens Wiklander size_t iv_len __unused) 11582d91db1SJens Wiklander { 1161c5fdd1fSJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED; 11782d91db1SJens Wiklander } 11882d91db1SJens Wiklander 11982d91db1SJens Wiklander TEE_Result crypto_cipher_update(void *ctx __unused, uint32_t algo __unused, 12082d91db1SJens Wiklander TEE_OperationMode mode __unused, 12182d91db1SJens Wiklander bool last_block __unused, 12282d91db1SJens Wiklander const uint8_t *data __unused, 12382d91db1SJens Wiklander size_t len __unused, uint8_t *dst __unused) 12482d91db1SJens Wiklander { 1251c5fdd1fSJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED; 12682d91db1SJens Wiklander } 12782d91db1SJens Wiklander 12882d91db1SJens Wiklander void crypto_cipher_final(void *ctx __unused, uint32_t algo __unused) 12982d91db1SJens Wiklander { 13082d91db1SJens Wiklander } 13182d91db1SJens Wiklander #endif /*_CFG_CRYPTO_WITH_CIPHER*/ 132e9eaba5cSJens Wiklander 1336d259e05SJens Wiklander TEE_Result crypto_cipher_get_block_size(uint32_t algo, size_t *size) 1346d259e05SJens Wiklander { 1356d259e05SJens Wiklander uint32_t class = TEE_ALG_GET_CLASS(algo); 1366d259e05SJens Wiklander 1376d259e05SJens Wiklander if (class != TEE_OPERATION_CIPHER && class != TEE_OPERATION_MAC && 1386d259e05SJens Wiklander class != TEE_OPERATION_AE) 1396d259e05SJens Wiklander return TEE_ERROR_BAD_PARAMETERS; 1406d259e05SJens Wiklander 1416d259e05SJens Wiklander switch (TEE_ALG_GET_MAIN_ALG(algo)) { 1426d259e05SJens Wiklander case TEE_MAIN_ALGO_AES: 1436d259e05SJens Wiklander *size = TEE_AES_BLOCK_SIZE; 1446d259e05SJens Wiklander return TEE_SUCCESS; 1456d259e05SJens Wiklander case TEE_MAIN_ALGO_DES: 1466d259e05SJens Wiklander case TEE_MAIN_ALGO_DES3: 1476d259e05SJens Wiklander *size = TEE_DES_BLOCK_SIZE; 1486d259e05SJens Wiklander return TEE_SUCCESS; 1496d259e05SJens Wiklander default: 1506d259e05SJens Wiklander return TEE_ERROR_NOT_SUPPORTED; 1516d259e05SJens Wiklander } 1526d259e05SJens Wiklander } 1536d259e05SJens Wiklander 154*5da36a24SJens Wiklander TEE_Result crypto_mac_alloc_ctx(void **ctx, uint32_t algo) 155e9eaba5cSJens Wiklander { 156*5da36a24SJens Wiklander TEE_Result res = TEE_SUCCESS; 157*5da36a24SJens Wiklander struct crypto_mac_ctx *c = NULL; 158*5da36a24SJens Wiklander 159*5da36a24SJens Wiklander switch (algo) { 160*5da36a24SJens Wiklander case TEE_ALG_HMAC_MD5: 161*5da36a24SJens Wiklander res = crypto_hmac_md5_alloc_ctx(&c); 162*5da36a24SJens Wiklander break; 163*5da36a24SJens Wiklander case TEE_ALG_HMAC_SHA1: 164*5da36a24SJens Wiklander res = crypto_hmac_sha1_alloc_ctx(&c); 165*5da36a24SJens Wiklander break; 166*5da36a24SJens Wiklander case TEE_ALG_HMAC_SHA224: 167*5da36a24SJens Wiklander res = crypto_hmac_sha224_alloc_ctx(&c); 168*5da36a24SJens Wiklander break; 169*5da36a24SJens Wiklander case TEE_ALG_HMAC_SHA256: 170*5da36a24SJens Wiklander res = crypto_hmac_sha256_alloc_ctx(&c); 171*5da36a24SJens Wiklander break; 172*5da36a24SJens Wiklander case TEE_ALG_HMAC_SHA384: 173*5da36a24SJens Wiklander res = crypto_hmac_sha384_alloc_ctx(&c); 174*5da36a24SJens Wiklander break; 175*5da36a24SJens Wiklander case TEE_ALG_HMAC_SHA512: 176*5da36a24SJens Wiklander res = crypto_hmac_sha512_alloc_ctx(&c); 177*5da36a24SJens Wiklander break; 178*5da36a24SJens Wiklander case TEE_ALG_AES_CBC_MAC_NOPAD: 179*5da36a24SJens Wiklander res = crypto_aes_cbc_mac_nopad_alloc_ctx(&c); 180*5da36a24SJens Wiklander break; 181*5da36a24SJens Wiklander case TEE_ALG_AES_CBC_MAC_PKCS5: 182*5da36a24SJens Wiklander res = crypto_aes_cbc_mac_pkcs5_alloc_ctx(&c); 183*5da36a24SJens Wiklander break; 184*5da36a24SJens Wiklander case TEE_ALG_DES_CBC_MAC_NOPAD: 185*5da36a24SJens Wiklander res = crypto_des_cbc_mac_nopad_alloc_ctx(&c); 186*5da36a24SJens Wiklander break; 187*5da36a24SJens Wiklander case TEE_ALG_DES_CBC_MAC_PKCS5: 188*5da36a24SJens Wiklander res = crypto_des_cbc_mac_pkcs5_alloc_ctx(&c); 189*5da36a24SJens Wiklander break; 190*5da36a24SJens Wiklander case TEE_ALG_DES3_CBC_MAC_NOPAD: 191*5da36a24SJens Wiklander res = crypto_des3_cbc_mac_nopad_alloc_ctx(&c); 192*5da36a24SJens Wiklander break; 193*5da36a24SJens Wiklander case TEE_ALG_DES3_CBC_MAC_PKCS5: 194*5da36a24SJens Wiklander res = crypto_des3_cbc_mac_pkcs5_alloc_ctx(&c); 195*5da36a24SJens Wiklander break; 196*5da36a24SJens Wiklander case TEE_ALG_AES_CMAC: 197*5da36a24SJens Wiklander res = crypto_aes_cmac_alloc_ctx(&c); 198*5da36a24SJens Wiklander break; 199*5da36a24SJens Wiklander default: 200*5da36a24SJens Wiklander return TEE_ERROR_NOT_SUPPORTED; 201*5da36a24SJens Wiklander } 202*5da36a24SJens Wiklander 203*5da36a24SJens Wiklander if (!res) 204*5da36a24SJens Wiklander *ctx = c; 205*5da36a24SJens Wiklander 206*5da36a24SJens Wiklander return res; 207*5da36a24SJens Wiklander } 208*5da36a24SJens Wiklander 209*5da36a24SJens Wiklander static const struct crypto_mac_ops *mac_ops(void *ctx) 210*5da36a24SJens Wiklander { 211*5da36a24SJens Wiklander struct crypto_mac_ctx *c = ctx; 212*5da36a24SJens Wiklander 213*5da36a24SJens Wiklander assert(c && c->ops); 214*5da36a24SJens Wiklander 215*5da36a24SJens Wiklander return c->ops; 216e9eaba5cSJens Wiklander } 217e9eaba5cSJens Wiklander 218ce7a47f5SJerome Forissier void crypto_mac_free_ctx(void *ctx, uint32_t algo __unused) 21982ef73bcSJens Wiklander { 220ce7a47f5SJerome Forissier if (ctx) 221*5da36a24SJens Wiklander mac_ops(ctx)->free_ctx(ctx); 22282ef73bcSJens Wiklander } 22382ef73bcSJens Wiklander 224*5da36a24SJens Wiklander void crypto_mac_copy_state(void *dst_ctx, void *src_ctx, uint32_t algo __unused) 22582ef73bcSJens Wiklander { 226*5da36a24SJens Wiklander mac_ops(dst_ctx)->copy_state(dst_ctx, src_ctx); 22782ef73bcSJens Wiklander } 22882ef73bcSJens Wiklander 229*5da36a24SJens Wiklander TEE_Result crypto_mac_init(void *ctx, uint32_t algo __unused, 230*5da36a24SJens Wiklander const uint8_t *key, size_t len) 231e9eaba5cSJens Wiklander { 232*5da36a24SJens Wiklander return mac_ops(ctx)->init(ctx, key, len); 233e9eaba5cSJens Wiklander } 234e9eaba5cSJens Wiklander 235*5da36a24SJens Wiklander TEE_Result crypto_mac_update(void *ctx, uint32_t algo __unused, 236*5da36a24SJens Wiklander const uint8_t *data, size_t len) 237e9eaba5cSJens Wiklander { 238*5da36a24SJens Wiklander if (!len) 239*5da36a24SJens Wiklander return TEE_SUCCESS; 240*5da36a24SJens Wiklander 241*5da36a24SJens Wiklander return mac_ops(ctx)->update(ctx, data, len); 242e9eaba5cSJens Wiklander } 243e9eaba5cSJens Wiklander 244*5da36a24SJens Wiklander TEE_Result crypto_mac_final(void *ctx, uint32_t algo __unused, 245*5da36a24SJens Wiklander uint8_t *digest, size_t digest_len) 246e9eaba5cSJens Wiklander { 247*5da36a24SJens Wiklander return mac_ops(ctx)->final(ctx, digest, digest_len); 248e9eaba5cSJens Wiklander } 249e9eaba5cSJens Wiklander 250d7ac7d0fSJens Wiklander TEE_Result crypto_authenc_alloc_ctx(void **ctx, uint32_t algo) 2518875ce46SJens Wiklander { 252d0620b01SJens Wiklander switch (algo) { 253d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM) 254d0620b01SJens Wiklander case TEE_ALG_AES_CCM: 255d7ac7d0fSJens Wiklander return crypto_aes_ccm_alloc_ctx(ctx); 256d0620b01SJens Wiklander #endif 257d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM) 258d0620b01SJens Wiklander case TEE_ALG_AES_GCM: 259d7ac7d0fSJens Wiklander return crypto_aes_gcm_alloc_ctx(ctx); 260d0620b01SJens Wiklander #endif 261d0620b01SJens Wiklander default: 2628875ce46SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 2638875ce46SJens Wiklander } 264d0620b01SJens Wiklander } 2658875ce46SJens Wiklander 266d7ac7d0fSJens Wiklander void crypto_authenc_free_ctx(void *ctx, uint32_t algo) 267d7ac7d0fSJens Wiklander { 268d7ac7d0fSJens Wiklander switch (algo) { 269d7ac7d0fSJens Wiklander #if defined(CFG_CRYPTO_CCM) 270d7ac7d0fSJens Wiklander case TEE_ALG_AES_CCM: 271d7ac7d0fSJens Wiklander crypto_aes_ccm_free_ctx(ctx); 272d7ac7d0fSJens Wiklander break; 273d7ac7d0fSJens Wiklander #endif 274d7ac7d0fSJens Wiklander #if defined(CFG_CRYPTO_GCM) 275d7ac7d0fSJens Wiklander case TEE_ALG_AES_GCM: 276d7ac7d0fSJens Wiklander crypto_aes_gcm_free_ctx(ctx); 277d7ac7d0fSJens Wiklander break; 278d7ac7d0fSJens Wiklander #endif 279d7ac7d0fSJens Wiklander default: 280ce7a47f5SJerome Forissier if (ctx) 281d7ac7d0fSJens Wiklander assert(0); 282d7ac7d0fSJens Wiklander } 283d7ac7d0fSJens Wiklander } 284d7ac7d0fSJens Wiklander 285d7ac7d0fSJens Wiklander void crypto_authenc_copy_state(void *dst_ctx, void *src_ctx, uint32_t algo) 286d7ac7d0fSJens Wiklander { 287d7ac7d0fSJens Wiklander switch (algo) { 288d7ac7d0fSJens Wiklander #if defined(CFG_CRYPTO_CCM) 289d7ac7d0fSJens Wiklander case TEE_ALG_AES_CCM: 290d7ac7d0fSJens Wiklander crypto_aes_ccm_copy_state(dst_ctx, src_ctx); 291d7ac7d0fSJens Wiklander break; 292d7ac7d0fSJens Wiklander #endif 293d7ac7d0fSJens Wiklander #if defined(CFG_CRYPTO_GCM) 294d7ac7d0fSJens Wiklander case TEE_ALG_AES_GCM: 295d7ac7d0fSJens Wiklander crypto_aes_gcm_copy_state(dst_ctx, src_ctx); 296d7ac7d0fSJens Wiklander break; 297d7ac7d0fSJens Wiklander #endif 298d7ac7d0fSJens Wiklander default: 299d7ac7d0fSJens Wiklander assert(0); 300d7ac7d0fSJens Wiklander } 301d7ac7d0fSJens Wiklander } 302d7ac7d0fSJens Wiklander 303d0620b01SJens Wiklander TEE_Result crypto_authenc_init(void *ctx __maybe_unused, 304d0620b01SJens Wiklander uint32_t algo __maybe_unused, 305d0620b01SJens Wiklander TEE_OperationMode mode __maybe_unused, 306d0620b01SJens Wiklander const uint8_t *key __maybe_unused, 307d0620b01SJens Wiklander size_t key_len __maybe_unused, 308d0620b01SJens Wiklander const uint8_t *nonce __maybe_unused, 309d0620b01SJens Wiklander size_t nonce_len __maybe_unused, 310d0620b01SJens Wiklander size_t tag_len __maybe_unused, 311d0620b01SJens Wiklander size_t aad_len __maybe_unused, 312d0620b01SJens Wiklander size_t payload_len __maybe_unused) 313d0620b01SJens Wiklander { 314d0620b01SJens Wiklander switch (algo) { 315d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM) 316d0620b01SJens Wiklander case TEE_ALG_AES_CCM: 317d0620b01SJens Wiklander return crypto_aes_ccm_init(ctx, mode, key, key_len, nonce, 318d0620b01SJens Wiklander nonce_len, tag_len, aad_len, 319d0620b01SJens Wiklander payload_len); 320d0620b01SJens Wiklander #endif 321d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM) 322d0620b01SJens Wiklander case TEE_ALG_AES_GCM: 323d0620b01SJens Wiklander return crypto_aes_gcm_init(ctx, mode, key, key_len, nonce, 324d0620b01SJens Wiklander nonce_len, tag_len); 325d0620b01SJens Wiklander #endif 326d0620b01SJens Wiklander default: 327d0620b01SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 328d0620b01SJens Wiklander } 329d0620b01SJens Wiklander } 330d0620b01SJens Wiklander 331d0620b01SJens Wiklander TEE_Result crypto_authenc_update_aad(void *ctx __maybe_unused, 332d0620b01SJens Wiklander uint32_t algo __maybe_unused, 3338875ce46SJens Wiklander TEE_OperationMode mode __unused, 334d0620b01SJens Wiklander const uint8_t *data __maybe_unused, 335d0620b01SJens Wiklander size_t len __maybe_unused) 3368875ce46SJens Wiklander { 337d0620b01SJens Wiklander switch (algo) { 338d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM) 339d0620b01SJens Wiklander case TEE_ALG_AES_CCM: 340d0620b01SJens Wiklander return crypto_aes_ccm_update_aad(ctx, data, len); 341d0620b01SJens Wiklander #endif 342d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM) 343d0620b01SJens Wiklander case TEE_ALG_AES_GCM: 344d0620b01SJens Wiklander return crypto_aes_gcm_update_aad(ctx, data, len); 345d0620b01SJens Wiklander #endif 346d0620b01SJens Wiklander default: 3478875ce46SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 3488875ce46SJens Wiklander } 349d0620b01SJens Wiklander } 3508875ce46SJens Wiklander 351d0620b01SJens Wiklander TEE_Result crypto_authenc_update_payload(void *ctx __maybe_unused, 352d0620b01SJens Wiklander uint32_t algo __maybe_unused, 353d0620b01SJens Wiklander TEE_OperationMode mode __maybe_unused, 354d0620b01SJens Wiklander const uint8_t *src_data __maybe_unused, 355d0620b01SJens Wiklander size_t src_len __maybe_unused, 356d0620b01SJens Wiklander uint8_t *dst_data __maybe_unused, 357d0620b01SJens Wiklander size_t *dst_len __maybe_unused) 3588875ce46SJens Wiklander { 359d0620b01SJens Wiklander size_t dl = *dst_len; 360d0620b01SJens Wiklander 361d0620b01SJens Wiklander *dst_len = src_len; 362d0620b01SJens Wiklander if (dl < src_len) 363d0620b01SJens Wiklander return TEE_ERROR_SHORT_BUFFER; 364d0620b01SJens Wiklander 365d0620b01SJens Wiklander switch (algo) { 366d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM) 367d0620b01SJens Wiklander case TEE_ALG_AES_CCM: 368d0620b01SJens Wiklander return crypto_aes_ccm_update_payload(ctx, mode, src_data, 369d0620b01SJens Wiklander src_len, dst_data); 370d0620b01SJens Wiklander #endif 371d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM) 372d0620b01SJens Wiklander case TEE_ALG_AES_GCM: 373d0620b01SJens Wiklander return crypto_aes_gcm_update_payload(ctx, mode, src_data, 374d0620b01SJens Wiklander src_len, dst_data); 375d0620b01SJens Wiklander #endif 376d0620b01SJens Wiklander default: 3778875ce46SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 3788875ce46SJens Wiklander } 379d0620b01SJens Wiklander } 3808875ce46SJens Wiklander 381d0620b01SJens Wiklander TEE_Result crypto_authenc_enc_final(void *ctx __maybe_unused, 382d0620b01SJens Wiklander uint32_t algo __maybe_unused, 383d0620b01SJens Wiklander const uint8_t *src_data __maybe_unused, 384d0620b01SJens Wiklander size_t src_len __maybe_unused, 385d0620b01SJens Wiklander uint8_t *dst_data __maybe_unused, 386d0620b01SJens Wiklander size_t *dst_len __maybe_unused, 387d0620b01SJens Wiklander uint8_t *dst_tag __maybe_unused, 388d0620b01SJens Wiklander size_t *dst_tag_len __maybe_unused) 3898875ce46SJens Wiklander { 390d0620b01SJens Wiklander size_t dl = *dst_len; 391d0620b01SJens Wiklander 392d0620b01SJens Wiklander *dst_len = src_len; 393d0620b01SJens Wiklander if (dl < src_len) 394d0620b01SJens Wiklander return TEE_ERROR_SHORT_BUFFER; 395d0620b01SJens Wiklander 396d0620b01SJens Wiklander switch (algo) { 397d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM) 398d0620b01SJens Wiklander case TEE_ALG_AES_CCM: 399d0620b01SJens Wiklander return crypto_aes_ccm_enc_final(ctx, src_data, src_len, 400d0620b01SJens Wiklander dst_data, dst_tag, dst_tag_len); 401d0620b01SJens Wiklander #endif 402d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM) 403d0620b01SJens Wiklander case TEE_ALG_AES_GCM: 404d0620b01SJens Wiklander return crypto_aes_gcm_enc_final(ctx, src_data, src_len, 405d0620b01SJens Wiklander dst_data, dst_tag, dst_tag_len); 406d0620b01SJens Wiklander #endif 407d0620b01SJens Wiklander default: 4088875ce46SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 4098875ce46SJens Wiklander } 410d0620b01SJens Wiklander } 4118875ce46SJens Wiklander 412d0620b01SJens Wiklander TEE_Result crypto_authenc_dec_final(void *ctx __maybe_unused, 413d0620b01SJens Wiklander uint32_t algo __maybe_unused, 414d0620b01SJens Wiklander const uint8_t *src_data __maybe_unused, 415d0620b01SJens Wiklander size_t src_len __maybe_unused, 416d0620b01SJens Wiklander uint8_t *dst_data __maybe_unused, 417d0620b01SJens Wiklander size_t *dst_len __maybe_unused, 418d0620b01SJens Wiklander const uint8_t *tag __maybe_unused, 419d0620b01SJens Wiklander size_t tag_len __maybe_unused) 4208875ce46SJens Wiklander { 421d0620b01SJens Wiklander size_t dl = *dst_len; 422d0620b01SJens Wiklander 423d0620b01SJens Wiklander *dst_len = src_len; 424d0620b01SJens Wiklander if (dl < src_len) 425d0620b01SJens Wiklander return TEE_ERROR_SHORT_BUFFER; 426d0620b01SJens Wiklander 427d0620b01SJens Wiklander switch (algo) { 428d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM) 429d0620b01SJens Wiklander case TEE_ALG_AES_CCM: 430d0620b01SJens Wiklander return crypto_aes_ccm_dec_final(ctx, src_data, src_len, 431d0620b01SJens Wiklander dst_data, tag, tag_len); 432d0620b01SJens Wiklander #endif 433d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM) 434d0620b01SJens Wiklander case TEE_ALG_AES_GCM: 435d0620b01SJens Wiklander return crypto_aes_gcm_dec_final(ctx, src_data, src_len, 436d0620b01SJens Wiklander dst_data, tag, tag_len); 437d0620b01SJens Wiklander #endif 438d0620b01SJens Wiklander default: 4398875ce46SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 4408875ce46SJens Wiklander } 4418875ce46SJens Wiklander } 4428875ce46SJens Wiklander 443d0620b01SJens Wiklander void crypto_authenc_final(void *ctx __maybe_unused, 444d0620b01SJens Wiklander uint32_t algo __maybe_unused) 4458875ce46SJens Wiklander { 446d0620b01SJens Wiklander switch (algo) { 447d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM) 448d0620b01SJens Wiklander case TEE_ALG_AES_CCM: 449d0620b01SJens Wiklander crypto_aes_ccm_final(ctx); 450d0620b01SJens Wiklander break; 451d0620b01SJens Wiklander #endif 452d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM) 453d0620b01SJens Wiklander case TEE_ALG_AES_GCM: 454d0620b01SJens Wiklander crypto_aes_gcm_final(ctx); 455d0620b01SJens Wiklander break; 456d0620b01SJens Wiklander #endif 457d0620b01SJens Wiklander default: 458d0620b01SJens Wiklander break; 4598875ce46SJens Wiklander } 460d0620b01SJens Wiklander } 46133790cc1SJens Wiklander 46233790cc1SJens Wiklander #if !defined(_CFG_CRYPTO_WITH_ACIPHER) 46333790cc1SJens Wiklander struct bignum *crypto_bignum_allocate(size_t size_bits __unused) 46433790cc1SJens Wiklander { 46533790cc1SJens Wiklander return NULL; 46633790cc1SJens Wiklander } 46733790cc1SJens Wiklander 46833790cc1SJens Wiklander TEE_Result crypto_bignum_bin2bn(const uint8_t *from __unused, 46933790cc1SJens Wiklander size_t fromsize __unused, 47033790cc1SJens Wiklander struct bignum *to __unused) 47133790cc1SJens Wiklander { 47233790cc1SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 47333790cc1SJens Wiklander } 47433790cc1SJens Wiklander 47533790cc1SJens Wiklander size_t crypto_bignum_num_bytes(struct bignum *a __unused) 47633790cc1SJens Wiklander { 47733790cc1SJens Wiklander return 0; 47833790cc1SJens Wiklander } 47933790cc1SJens Wiklander 48033790cc1SJens Wiklander size_t crypto_bignum_num_bits(struct bignum *a __unused) 48133790cc1SJens Wiklander { 48233790cc1SJens Wiklander return 0; 48333790cc1SJens Wiklander } 48433790cc1SJens Wiklander 48533790cc1SJens Wiklander /* 48633790cc1SJens Wiklander * crypto_bignum_allocate() and crypto_bignum_bin2bn() failing should be 48733790cc1SJens Wiklander * enough to guarantee that the functions calling this function aren't 48833790cc1SJens Wiklander * called, but just in case add a panic() here to avoid unexpected 48933790cc1SJens Wiklander * behavoir. 49033790cc1SJens Wiklander */ 49133790cc1SJens Wiklander static void bignum_cant_happen(void) 49233790cc1SJens Wiklander { 49333790cc1SJens Wiklander volatile bool b = true; 49433790cc1SJens Wiklander 49533790cc1SJens Wiklander /* Avoid warning about function does not return */ 49633790cc1SJens Wiklander if (b) 49733790cc1SJens Wiklander panic(); 49833790cc1SJens Wiklander } 49933790cc1SJens Wiklander 50033790cc1SJens Wiklander void crypto_bignum_bn2bin(const struct bignum *from __unused, 50133790cc1SJens Wiklander uint8_t *to __unused) 50233790cc1SJens Wiklander { 50333790cc1SJens Wiklander bignum_cant_happen(); 50433790cc1SJens Wiklander } 50533790cc1SJens Wiklander 50633790cc1SJens Wiklander void crypto_bignum_copy(struct bignum *to __unused, 50733790cc1SJens Wiklander const struct bignum *from __unused) 50833790cc1SJens Wiklander { 50933790cc1SJens Wiklander bignum_cant_happen(); 51033790cc1SJens Wiklander } 51133790cc1SJens Wiklander 51233790cc1SJens Wiklander void crypto_bignum_free(struct bignum *a) 51333790cc1SJens Wiklander { 51433790cc1SJens Wiklander if (a) 51533790cc1SJens Wiklander panic(); 51633790cc1SJens Wiklander } 51733790cc1SJens Wiklander 51833790cc1SJens Wiklander void crypto_bignum_clear(struct bignum *a __unused) 51933790cc1SJens Wiklander { 52033790cc1SJens Wiklander bignum_cant_happen(); 52133790cc1SJens Wiklander } 52233790cc1SJens Wiklander 52333790cc1SJens Wiklander /* return -1 if a<b, 0 if a==b, +1 if a>b */ 52433790cc1SJens Wiklander int32_t crypto_bignum_compare(struct bignum *a __unused, 52533790cc1SJens Wiklander struct bignum *b __unused) 52633790cc1SJens Wiklander { 52733790cc1SJens Wiklander bignum_cant_happen(); 52833790cc1SJens Wiklander return -1; 52933790cc1SJens Wiklander } 53033790cc1SJens Wiklander #endif /*!_CFG_CRYPTO_WITH_ACIPHER*/ 531291e5450SJens Wiklander 532291e5450SJens Wiklander #if !defined(CFG_CRYPTO_RSA) || !defined(_CFG_CRYPTO_WITH_ACIPHER) 533291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_rsa_keypair(struct rsa_keypair *s __unused, 534291e5450SJens Wiklander size_t key_size_bits __unused) 535291e5450SJens Wiklander { 536291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 537291e5450SJens Wiklander } 538291e5450SJens Wiklander 539291e5450SJens Wiklander TEE_Result 540291e5450SJens Wiklander crypto_acipher_alloc_rsa_public_key(struct rsa_public_key *s __unused, 541291e5450SJens Wiklander size_t key_size_bits __unused) 542291e5450SJens Wiklander { 543291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 544291e5450SJens Wiklander } 545291e5450SJens Wiklander 546291e5450SJens Wiklander void crypto_acipher_free_rsa_public_key(struct rsa_public_key *s __unused) 547291e5450SJens Wiklander { 548291e5450SJens Wiklander } 549291e5450SJens Wiklander 550291e5450SJens Wiklander TEE_Result crypto_acipher_gen_rsa_key(struct rsa_keypair *key __unused, 551291e5450SJens Wiklander size_t key_size __unused) 552291e5450SJens Wiklander { 553291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 554291e5450SJens Wiklander } 555291e5450SJens Wiklander 556291e5450SJens Wiklander TEE_Result crypto_acipher_rsanopad_decrypt(struct rsa_keypair *key __unused, 557291e5450SJens Wiklander const uint8_t *src __unused, 558291e5450SJens Wiklander size_t src_len __unused, 559291e5450SJens Wiklander uint8_t *dst __unused, 560291e5450SJens Wiklander size_t *dst_len __unused) 561291e5450SJens Wiklander { 562291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 563291e5450SJens Wiklander } 564291e5450SJens Wiklander 565291e5450SJens Wiklander TEE_Result crypto_acipher_rsanopad_encrypt(struct rsa_public_key *key __unused, 566291e5450SJens Wiklander const uint8_t *src __unused, 567291e5450SJens Wiklander size_t src_len __unused, 568291e5450SJens Wiklander uint8_t *dst __unused, 569291e5450SJens Wiklander size_t *dst_len __unused) 570291e5450SJens Wiklander { 571291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 572291e5450SJens Wiklander } 573291e5450SJens Wiklander 574291e5450SJens Wiklander TEE_Result crypto_acipher_rsaes_decrypt(uint32_t algo __unused, 575291e5450SJens Wiklander struct rsa_keypair *key __unused, 576291e5450SJens Wiklander const uint8_t *label __unused, 577291e5450SJens Wiklander size_t label_len __unused, 578291e5450SJens Wiklander const uint8_t *src __unused, 579291e5450SJens Wiklander size_t src_len __unused, 580291e5450SJens Wiklander uint8_t *dst __unused, 581291e5450SJens Wiklander size_t *dst_len __unused) 582291e5450SJens Wiklander { 583291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 584291e5450SJens Wiklander } 585291e5450SJens Wiklander 586291e5450SJens Wiklander TEE_Result crypto_acipher_rsaes_encrypt(uint32_t algo __unused, 587291e5450SJens Wiklander struct rsa_public_key *key __unused, 588291e5450SJens Wiklander const uint8_t *label __unused, 589291e5450SJens Wiklander size_t label_len __unused, 590291e5450SJens Wiklander const uint8_t *src __unused, 591291e5450SJens Wiklander size_t src_len __unused, 592291e5450SJens Wiklander uint8_t *dst __unused, 593291e5450SJens Wiklander size_t *dst_len __unused) 594291e5450SJens Wiklander { 595291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 596291e5450SJens Wiklander } 597291e5450SJens Wiklander 598291e5450SJens Wiklander TEE_Result crypto_acipher_rsassa_sign(uint32_t algo __unused, 599291e5450SJens Wiklander struct rsa_keypair *key __unused, 600291e5450SJens Wiklander int salt_len __unused, 601291e5450SJens Wiklander const uint8_t *msg __unused, 602291e5450SJens Wiklander size_t msg_len __unused, 603291e5450SJens Wiklander uint8_t *sig __unused, 604291e5450SJens Wiklander size_t *sig_len __unused) 605291e5450SJens Wiklander { 606291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 607291e5450SJens Wiklander } 608291e5450SJens Wiklander 609291e5450SJens Wiklander TEE_Result crypto_acipher_rsassa_verify(uint32_t algo __unused, 610291e5450SJens Wiklander struct rsa_public_key *key __unused, 611291e5450SJens Wiklander int salt_len __unused, 612291e5450SJens Wiklander const uint8_t *msg __unused, 613291e5450SJens Wiklander size_t msg_len __unused, 614291e5450SJens Wiklander const uint8_t *sig __unused, 615291e5450SJens Wiklander size_t sig_len __unused) 616291e5450SJens Wiklander { 617291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 618291e5450SJens Wiklander } 619291e5450SJens Wiklander #endif /*!CFG_CRYPTO_RSA || !_CFG_CRYPTO_WITH_ACIPHER*/ 620291e5450SJens Wiklander 621291e5450SJens Wiklander #if !defined(CFG_CRYPTO_DSA) || !defined(_CFG_CRYPTO_WITH_ACIPHER) 622291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_dsa_keypair(struct dsa_keypair *s __unused, 623291e5450SJens Wiklander size_t key_size_bits __unused) 624291e5450SJens Wiklander { 625291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 626291e5450SJens Wiklander } 627291e5450SJens Wiklander 628291e5450SJens Wiklander TEE_Result 629291e5450SJens Wiklander crypto_acipher_alloc_dsa_public_key(struct dsa_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_gen_dsa_key(struct dsa_keypair *key __unused, 636291e5450SJens Wiklander size_t key_size __unused) 637291e5450SJens Wiklander { 638291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 639291e5450SJens Wiklander } 640291e5450SJens Wiklander 641291e5450SJens Wiklander TEE_Result crypto_acipher_dsa_sign(uint32_t algo __unused, 642291e5450SJens Wiklander struct dsa_keypair *key __unused, 643291e5450SJens Wiklander const uint8_t *msg __unused, 644291e5450SJens Wiklander size_t msg_len __unused, 645291e5450SJens Wiklander uint8_t *sig __unused, 646291e5450SJens Wiklander size_t *sig_len __unused) 647291e5450SJens Wiklander { 648291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 649291e5450SJens Wiklander } 650291e5450SJens Wiklander 651291e5450SJens Wiklander TEE_Result crypto_acipher_dsa_verify(uint32_t algo __unused, 652291e5450SJens Wiklander struct dsa_public_key *key __unused, 653291e5450SJens Wiklander const uint8_t *msg __unused, 654291e5450SJens Wiklander size_t msg_len __unused, 655291e5450SJens Wiklander const uint8_t *sig __unused, 656291e5450SJens Wiklander size_t sig_len __unused) 657291e5450SJens Wiklander { 658291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 659291e5450SJens Wiklander } 660291e5450SJens Wiklander #endif /*!CFG_CRYPTO_DSA || !_CFG_CRYPTO_WITH_ACIPHER*/ 661291e5450SJens Wiklander 662291e5450SJens Wiklander #if !defined(CFG_CRYPTO_DH) || !defined(_CFG_CRYPTO_WITH_ACIPHER) 663291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_dh_keypair(struct dh_keypair *s __unused, 664291e5450SJens Wiklander size_t key_size_bits __unused) 665291e5450SJens Wiklander { 666291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 667291e5450SJens Wiklander } 668291e5450SJens Wiklander 669291e5450SJens Wiklander TEE_Result crypto_acipher_gen_dh_key(struct dh_keypair *key __unused, 670291e5450SJens Wiklander struct bignum *q __unused, 671291e5450SJens Wiklander size_t xbits __unused) 672291e5450SJens Wiklander { 673291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 674291e5450SJens Wiklander } 675291e5450SJens Wiklander 676291e5450SJens Wiklander TEE_Result 677291e5450SJens Wiklander crypto_acipher_dh_shared_secret(struct dh_keypair *private_key __unused, 678291e5450SJens Wiklander struct bignum *public_key __unused, 679291e5450SJens Wiklander struct bignum *secret __unused) 680291e5450SJens Wiklander { 681291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 682291e5450SJens Wiklander } 683291e5450SJens Wiklander #endif /*!CFG_CRYPTO_DH || !_CFG_CRYPTO_WITH_ACIPHER*/ 684291e5450SJens Wiklander 685291e5450SJens Wiklander #if !defined(CFG_CRYPTO_ECC) || !defined(_CFG_CRYPTO_WITH_ACIPHER) 686291e5450SJens Wiklander TEE_Result 687291e5450SJens Wiklander crypto_acipher_alloc_ecc_public_key(struct ecc_public_key *s __unused, 688291e5450SJens Wiklander size_t key_size_bits __unused) 689291e5450SJens Wiklander { 690291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 691291e5450SJens Wiklander } 692291e5450SJens Wiklander 693291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_ecc_keypair(struct ecc_keypair *s __unused, 694291e5450SJens Wiklander size_t key_size_bits __unused) 695291e5450SJens Wiklander { 696291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 697291e5450SJens Wiklander } 698291e5450SJens Wiklander 699291e5450SJens Wiklander void crypto_acipher_free_ecc_public_key(struct ecc_public_key *s __unused) 700291e5450SJens Wiklander { 701291e5450SJens Wiklander } 702291e5450SJens Wiklander 703291e5450SJens Wiklander TEE_Result crypto_acipher_gen_ecc_key(struct ecc_keypair *key __unused) 704291e5450SJens Wiklander { 705291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 706291e5450SJens Wiklander } 707291e5450SJens Wiklander 708291e5450SJens Wiklander TEE_Result crypto_acipher_ecc_sign(uint32_t algo __unused, 709291e5450SJens Wiklander struct ecc_keypair *key __unused, 710291e5450SJens Wiklander const uint8_t *msg __unused, 711291e5450SJens Wiklander size_t msg_len __unused, 712291e5450SJens Wiklander uint8_t *sig __unused, 713291e5450SJens Wiklander size_t *sig_len __unused) 714291e5450SJens Wiklander { 715291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 716291e5450SJens Wiklander } 717291e5450SJens Wiklander 718291e5450SJens Wiklander TEE_Result crypto_acipher_ecc_verify(uint32_t algo __unused, 719291e5450SJens Wiklander struct ecc_public_key *key __unused, 720291e5450SJens Wiklander const uint8_t *msg __unused, 721291e5450SJens Wiklander size_t msg_len __unused, 722291e5450SJens Wiklander const uint8_t *sig __unused, 723291e5450SJens Wiklander size_t sig_len __unused) 724291e5450SJens Wiklander { 725291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 726291e5450SJens Wiklander } 727291e5450SJens Wiklander 728291e5450SJens Wiklander TEE_Result 729291e5450SJens Wiklander crypto_acipher_ecc_shared_secret(struct ecc_keypair *private_key __unused, 730291e5450SJens Wiklander struct ecc_public_key *public_key __unused, 731291e5450SJens Wiklander void *secret __unused, 732291e5450SJens Wiklander unsigned long *secret_len __unused) 733291e5450SJens Wiklander { 734291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 735291e5450SJens Wiklander } 736291e5450SJens Wiklander #endif /*!CFG_CRYPTO_ECC || !_CFG_CRYPTO_WITH_ACIPHER*/ 737