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> 11*6648f482SJens Wiklander #include <crypto/crypto_impl.h> 1233790cc1SJens Wiklander #include <kernel/panic.h> 13d7ac7d0fSJens Wiklander #include <stdlib.h> 14d7ac7d0fSJens Wiklander #include <string.h> 15b887bd8fSJens Wiklander 16*6648f482SJens Wiklander TEE_Result crypto_hash_alloc_ctx(void **ctx, uint32_t algo) 17b887bd8fSJens Wiklander { 18*6648f482SJens Wiklander TEE_Result res = TEE_SUCCESS; 19*6648f482SJens Wiklander struct crypto_hash_ctx *c = NULL; 20*6648f482SJens Wiklander 21*6648f482SJens Wiklander switch (algo) { 22*6648f482SJens Wiklander case TEE_ALG_MD5: 23*6648f482SJens Wiklander res = crypto_md5_alloc_ctx(&c); 24*6648f482SJens Wiklander break; 25*6648f482SJens Wiklander case TEE_ALG_SHA1: 26*6648f482SJens Wiklander res = crypto_sha1_alloc_ctx(&c); 27*6648f482SJens Wiklander break; 28*6648f482SJens Wiklander case TEE_ALG_SHA224: 29*6648f482SJens Wiklander res = crypto_sha224_alloc_ctx(&c); 30*6648f482SJens Wiklander break; 31*6648f482SJens Wiklander case TEE_ALG_SHA256: 32*6648f482SJens Wiklander res = crypto_sha256_alloc_ctx(&c); 33*6648f482SJens Wiklander break; 34*6648f482SJens Wiklander case TEE_ALG_SHA384: 35*6648f482SJens Wiklander res = crypto_sha384_alloc_ctx(&c); 36*6648f482SJens Wiklander break; 37*6648f482SJens Wiklander case TEE_ALG_SHA512: 38*6648f482SJens Wiklander res = crypto_sha512_alloc_ctx(&c); 39*6648f482SJens Wiklander break; 40*6648f482SJens Wiklander default: 41b887bd8fSJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 42b887bd8fSJens Wiklander } 43b887bd8fSJens Wiklander 44*6648f482SJens Wiklander if (!res) 45*6648f482SJens Wiklander *ctx = c; 46*6648f482SJens Wiklander 47*6648f482SJens Wiklander return res; 48*6648f482SJens Wiklander } 49*6648f482SJens Wiklander 50*6648f482SJens Wiklander static const struct crypto_hash_ops *hash_ops(void *ctx) 51*6648f482SJens Wiklander { 52*6648f482SJens Wiklander struct crypto_hash_ctx *c = ctx; 53*6648f482SJens Wiklander 54*6648f482SJens Wiklander assert(c && c->ops); 55*6648f482SJens Wiklander 56*6648f482SJens Wiklander return c->ops; 57*6648f482SJens Wiklander } 58*6648f482SJens Wiklander 59ce7a47f5SJerome Forissier void crypto_hash_free_ctx(void *ctx, uint32_t algo __unused) 60ecf2e014SJens Wiklander { 61ce7a47f5SJerome Forissier if (ctx) 62*6648f482SJens Wiklander hash_ops(ctx)->free_ctx(ctx); 63ecf2e014SJens Wiklander } 64ecf2e014SJens Wiklander 65*6648f482SJens Wiklander void crypto_hash_copy_state(void *dst_ctx, void *src_ctx, 66ecf2e014SJens Wiklander uint32_t algo __unused) 67ecf2e014SJens Wiklander { 68*6648f482SJens Wiklander hash_ops(dst_ctx)->copy_state(dst_ctx, src_ctx); 69ecf2e014SJens Wiklander } 70ecf2e014SJens Wiklander 71*6648f482SJens Wiklander TEE_Result crypto_hash_init(void *ctx, uint32_t algo __unused) 72b887bd8fSJens Wiklander { 73*6648f482SJens Wiklander return hash_ops(ctx)->init(ctx); 74b887bd8fSJens Wiklander } 75*6648f482SJens Wiklander 76*6648f482SJens Wiklander TEE_Result crypto_hash_update(void *ctx, uint32_t algo __unused, 77*6648f482SJens Wiklander const uint8_t *data, size_t len) 78b887bd8fSJens Wiklander { 79*6648f482SJens Wiklander return hash_ops(ctx)->update(ctx, data, len); 80b887bd8fSJens Wiklander } 81*6648f482SJens Wiklander 82*6648f482SJens Wiklander TEE_Result crypto_hash_final(void *ctx, uint32_t algo __unused, 83*6648f482SJens Wiklander uint8_t *digest, size_t len) 84b887bd8fSJens Wiklander { 85*6648f482SJens Wiklander return hash_ops(ctx)->final(ctx, digest, len); 86b887bd8fSJens Wiklander } 8782d91db1SJens Wiklander 8882d91db1SJens Wiklander #if !defined(_CFG_CRYPTO_WITH_CIPHER) 8972a9b1a0SJens Wiklander TEE_Result crypto_cipher_alloc_ctx(void **ctx __unused, uint32_t algo __unused) 9082d91db1SJens Wiklander { 911c5fdd1fSJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED; 9282d91db1SJens Wiklander } 9382d91db1SJens Wiklander 94ce7a47f5SJerome Forissier void crypto_cipher_free_ctx(void *ctx, uint32_t algo __unused) 9572a9b1a0SJens Wiklander { 96ce7a47f5SJerome Forissier if (ctx) 9772a9b1a0SJens Wiklander assert(0); 9872a9b1a0SJens Wiklander } 9972a9b1a0SJens Wiklander 10072a9b1a0SJens Wiklander void crypto_cipher_copy_state(void *dst_ctx __unused, void *src_ctx __unused, 10172a9b1a0SJens Wiklander uint32_t algo __unused) 10272a9b1a0SJens Wiklander { 10372a9b1a0SJens Wiklander assert(0); 10472a9b1a0SJens Wiklander } 10572a9b1a0SJens Wiklander 10682d91db1SJens Wiklander TEE_Result crypto_cipher_init(void *ctx __unused, uint32_t algo __unused, 10782d91db1SJens Wiklander TEE_OperationMode mode __unused, 10882d91db1SJens Wiklander const uint8_t *key1 __unused, 10982d91db1SJens Wiklander size_t key1_len __unused, 11082d91db1SJens Wiklander const uint8_t *key2 __unused, 11182d91db1SJens Wiklander size_t key2_len __unused, 11282d91db1SJens Wiklander const uint8_t *iv __unused, 11382d91db1SJens Wiklander size_t iv_len __unused) 11482d91db1SJens Wiklander { 1151c5fdd1fSJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED; 11682d91db1SJens Wiklander } 11782d91db1SJens Wiklander 11882d91db1SJens Wiklander TEE_Result crypto_cipher_update(void *ctx __unused, uint32_t algo __unused, 11982d91db1SJens Wiklander TEE_OperationMode mode __unused, 12082d91db1SJens Wiklander bool last_block __unused, 12182d91db1SJens Wiklander const uint8_t *data __unused, 12282d91db1SJens Wiklander size_t len __unused, uint8_t *dst __unused) 12382d91db1SJens Wiklander { 1241c5fdd1fSJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED; 12582d91db1SJens Wiklander } 12682d91db1SJens Wiklander 12782d91db1SJens Wiklander void crypto_cipher_final(void *ctx __unused, uint32_t algo __unused) 12882d91db1SJens Wiklander { 12982d91db1SJens Wiklander } 13082d91db1SJens Wiklander 13182d91db1SJens Wiklander TEE_Result crypto_cipher_get_block_size(uint32_t algo __unused, 13282d91db1SJens Wiklander size_t *size __unused) 13382d91db1SJens Wiklander { 1341c5fdd1fSJerome Forissier return TEE_ERROR_NOT_IMPLEMENTED; 13582d91db1SJens Wiklander } 13682d91db1SJens Wiklander #endif /*_CFG_CRYPTO_WITH_CIPHER*/ 137e9eaba5cSJens Wiklander 138e9eaba5cSJens Wiklander #if !defined(_CFG_CRYPTO_WITH_MAC) 13982ef73bcSJens Wiklander TEE_Result crypto_mac_alloc_ctx(void **ctx __unused, uint32_t algo __unused) 140e9eaba5cSJens Wiklander { 141e9eaba5cSJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 142e9eaba5cSJens Wiklander } 143e9eaba5cSJens Wiklander 144ce7a47f5SJerome Forissier void crypto_mac_free_ctx(void *ctx, uint32_t algo __unused) 14582ef73bcSJens Wiklander { 146ce7a47f5SJerome Forissier if (ctx) 14782ef73bcSJens Wiklander assert(0); 14882ef73bcSJens Wiklander } 14982ef73bcSJens Wiklander 15082ef73bcSJens Wiklander void crypto_mac_copy_state(void *dst_ctx __unused, void *src_ctx __unused, 15182ef73bcSJens Wiklander uint32_t algo __unused) 15282ef73bcSJens Wiklander { 15382ef73bcSJens Wiklander assert(0); 15482ef73bcSJens Wiklander } 15582ef73bcSJens Wiklander 156e9eaba5cSJens Wiklander TEE_Result crypto_mac_init(void *ctx __unused, uint32_t algo __unused, 157e9eaba5cSJens Wiklander const uint8_t *key __unused, size_t len __unused) 158e9eaba5cSJens Wiklander { 159e9eaba5cSJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 160e9eaba5cSJens Wiklander } 161e9eaba5cSJens Wiklander 162e9eaba5cSJens Wiklander TEE_Result crypto_mac_update(void *ctx __unused, uint32_t algo __unused, 163e9eaba5cSJens Wiklander const uint8_t *data __unused, size_t len __unused) 164e9eaba5cSJens Wiklander { 165e9eaba5cSJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 166e9eaba5cSJens Wiklander } 167e9eaba5cSJens Wiklander 168e9eaba5cSJens Wiklander TEE_Result crypto_mac_final(void *ctx __unused, uint32_t algo __unused, 169e9eaba5cSJens Wiklander uint8_t *digest __unused, 170e9eaba5cSJens Wiklander size_t digest_len __unused) 171e9eaba5cSJens Wiklander { 172e9eaba5cSJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 173e9eaba5cSJens Wiklander } 174e9eaba5cSJens Wiklander #endif /*_CFG_CRYPTO_WITH_MAC*/ 175e9eaba5cSJens Wiklander 176d7ac7d0fSJens Wiklander TEE_Result crypto_authenc_alloc_ctx(void **ctx, uint32_t algo) 1778875ce46SJens Wiklander { 178d0620b01SJens Wiklander switch (algo) { 179d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM) 180d0620b01SJens Wiklander case TEE_ALG_AES_CCM: 181d7ac7d0fSJens Wiklander return crypto_aes_ccm_alloc_ctx(ctx); 182d0620b01SJens Wiklander #endif 183d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM) 184d0620b01SJens Wiklander case TEE_ALG_AES_GCM: 185d7ac7d0fSJens Wiklander return crypto_aes_gcm_alloc_ctx(ctx); 186d0620b01SJens Wiklander #endif 187d0620b01SJens Wiklander default: 1888875ce46SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 1898875ce46SJens Wiklander } 190d0620b01SJens Wiklander } 1918875ce46SJens Wiklander 192d7ac7d0fSJens Wiklander void crypto_authenc_free_ctx(void *ctx, uint32_t algo) 193d7ac7d0fSJens Wiklander { 194d7ac7d0fSJens Wiklander switch (algo) { 195d7ac7d0fSJens Wiklander #if defined(CFG_CRYPTO_CCM) 196d7ac7d0fSJens Wiklander case TEE_ALG_AES_CCM: 197d7ac7d0fSJens Wiklander crypto_aes_ccm_free_ctx(ctx); 198d7ac7d0fSJens Wiklander break; 199d7ac7d0fSJens Wiklander #endif 200d7ac7d0fSJens Wiklander #if defined(CFG_CRYPTO_GCM) 201d7ac7d0fSJens Wiklander case TEE_ALG_AES_GCM: 202d7ac7d0fSJens Wiklander crypto_aes_gcm_free_ctx(ctx); 203d7ac7d0fSJens Wiklander break; 204d7ac7d0fSJens Wiklander #endif 205d7ac7d0fSJens Wiklander default: 206ce7a47f5SJerome Forissier if (ctx) 207d7ac7d0fSJens Wiklander assert(0); 208d7ac7d0fSJens Wiklander } 209d7ac7d0fSJens Wiklander } 210d7ac7d0fSJens Wiklander 211d7ac7d0fSJens Wiklander void crypto_authenc_copy_state(void *dst_ctx, void *src_ctx, uint32_t algo) 212d7ac7d0fSJens Wiklander { 213d7ac7d0fSJens Wiklander switch (algo) { 214d7ac7d0fSJens Wiklander #if defined(CFG_CRYPTO_CCM) 215d7ac7d0fSJens Wiklander case TEE_ALG_AES_CCM: 216d7ac7d0fSJens Wiklander crypto_aes_ccm_copy_state(dst_ctx, src_ctx); 217d7ac7d0fSJens Wiklander break; 218d7ac7d0fSJens Wiklander #endif 219d7ac7d0fSJens Wiklander #if defined(CFG_CRYPTO_GCM) 220d7ac7d0fSJens Wiklander case TEE_ALG_AES_GCM: 221d7ac7d0fSJens Wiklander crypto_aes_gcm_copy_state(dst_ctx, src_ctx); 222d7ac7d0fSJens Wiklander break; 223d7ac7d0fSJens Wiklander #endif 224d7ac7d0fSJens Wiklander default: 225d7ac7d0fSJens Wiklander assert(0); 226d7ac7d0fSJens Wiklander } 227d7ac7d0fSJens Wiklander } 228d7ac7d0fSJens Wiklander 229d0620b01SJens Wiklander TEE_Result crypto_authenc_init(void *ctx __maybe_unused, 230d0620b01SJens Wiklander uint32_t algo __maybe_unused, 231d0620b01SJens Wiklander TEE_OperationMode mode __maybe_unused, 232d0620b01SJens Wiklander const uint8_t *key __maybe_unused, 233d0620b01SJens Wiklander size_t key_len __maybe_unused, 234d0620b01SJens Wiklander const uint8_t *nonce __maybe_unused, 235d0620b01SJens Wiklander size_t nonce_len __maybe_unused, 236d0620b01SJens Wiklander size_t tag_len __maybe_unused, 237d0620b01SJens Wiklander size_t aad_len __maybe_unused, 238d0620b01SJens Wiklander size_t payload_len __maybe_unused) 239d0620b01SJens Wiklander { 240d0620b01SJens Wiklander switch (algo) { 241d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM) 242d0620b01SJens Wiklander case TEE_ALG_AES_CCM: 243d0620b01SJens Wiklander return crypto_aes_ccm_init(ctx, mode, key, key_len, nonce, 244d0620b01SJens Wiklander nonce_len, tag_len, aad_len, 245d0620b01SJens Wiklander payload_len); 246d0620b01SJens Wiklander #endif 247d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM) 248d0620b01SJens Wiklander case TEE_ALG_AES_GCM: 249d0620b01SJens Wiklander return crypto_aes_gcm_init(ctx, mode, key, key_len, nonce, 250d0620b01SJens Wiklander nonce_len, tag_len); 251d0620b01SJens Wiklander #endif 252d0620b01SJens Wiklander default: 253d0620b01SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 254d0620b01SJens Wiklander } 255d0620b01SJens Wiklander } 256d0620b01SJens Wiklander 257d0620b01SJens Wiklander TEE_Result crypto_authenc_update_aad(void *ctx __maybe_unused, 258d0620b01SJens Wiklander uint32_t algo __maybe_unused, 2598875ce46SJens Wiklander TEE_OperationMode mode __unused, 260d0620b01SJens Wiklander const uint8_t *data __maybe_unused, 261d0620b01SJens Wiklander size_t len __maybe_unused) 2628875ce46SJens Wiklander { 263d0620b01SJens Wiklander switch (algo) { 264d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM) 265d0620b01SJens Wiklander case TEE_ALG_AES_CCM: 266d0620b01SJens Wiklander return crypto_aes_ccm_update_aad(ctx, data, len); 267d0620b01SJens Wiklander #endif 268d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM) 269d0620b01SJens Wiklander case TEE_ALG_AES_GCM: 270d0620b01SJens Wiklander return crypto_aes_gcm_update_aad(ctx, data, len); 271d0620b01SJens Wiklander #endif 272d0620b01SJens Wiklander default: 2738875ce46SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 2748875ce46SJens Wiklander } 275d0620b01SJens Wiklander } 2768875ce46SJens Wiklander 277d0620b01SJens Wiklander TEE_Result crypto_authenc_update_payload(void *ctx __maybe_unused, 278d0620b01SJens Wiklander uint32_t algo __maybe_unused, 279d0620b01SJens Wiklander TEE_OperationMode mode __maybe_unused, 280d0620b01SJens Wiklander const uint8_t *src_data __maybe_unused, 281d0620b01SJens Wiklander size_t src_len __maybe_unused, 282d0620b01SJens Wiklander uint8_t *dst_data __maybe_unused, 283d0620b01SJens Wiklander size_t *dst_len __maybe_unused) 2848875ce46SJens Wiklander { 285d0620b01SJens Wiklander size_t dl = *dst_len; 286d0620b01SJens Wiklander 287d0620b01SJens Wiklander *dst_len = src_len; 288d0620b01SJens Wiklander if (dl < src_len) 289d0620b01SJens Wiklander return TEE_ERROR_SHORT_BUFFER; 290d0620b01SJens Wiklander 291d0620b01SJens Wiklander switch (algo) { 292d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM) 293d0620b01SJens Wiklander case TEE_ALG_AES_CCM: 294d0620b01SJens Wiklander return crypto_aes_ccm_update_payload(ctx, mode, src_data, 295d0620b01SJens Wiklander src_len, dst_data); 296d0620b01SJens Wiklander #endif 297d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM) 298d0620b01SJens Wiklander case TEE_ALG_AES_GCM: 299d0620b01SJens Wiklander return crypto_aes_gcm_update_payload(ctx, mode, src_data, 300d0620b01SJens Wiklander src_len, dst_data); 301d0620b01SJens Wiklander #endif 302d0620b01SJens Wiklander default: 3038875ce46SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 3048875ce46SJens Wiklander } 305d0620b01SJens Wiklander } 3068875ce46SJens Wiklander 307d0620b01SJens Wiklander TEE_Result crypto_authenc_enc_final(void *ctx __maybe_unused, 308d0620b01SJens Wiklander uint32_t algo __maybe_unused, 309d0620b01SJens Wiklander const uint8_t *src_data __maybe_unused, 310d0620b01SJens Wiklander size_t src_len __maybe_unused, 311d0620b01SJens Wiklander uint8_t *dst_data __maybe_unused, 312d0620b01SJens Wiklander size_t *dst_len __maybe_unused, 313d0620b01SJens Wiklander uint8_t *dst_tag __maybe_unused, 314d0620b01SJens Wiklander size_t *dst_tag_len __maybe_unused) 3158875ce46SJens Wiklander { 316d0620b01SJens Wiklander size_t dl = *dst_len; 317d0620b01SJens Wiklander 318d0620b01SJens Wiklander *dst_len = src_len; 319d0620b01SJens Wiklander if (dl < src_len) 320d0620b01SJens Wiklander return TEE_ERROR_SHORT_BUFFER; 321d0620b01SJens Wiklander 322d0620b01SJens Wiklander switch (algo) { 323d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM) 324d0620b01SJens Wiklander case TEE_ALG_AES_CCM: 325d0620b01SJens Wiklander return crypto_aes_ccm_enc_final(ctx, src_data, src_len, 326d0620b01SJens Wiklander dst_data, dst_tag, dst_tag_len); 327d0620b01SJens Wiklander #endif 328d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM) 329d0620b01SJens Wiklander case TEE_ALG_AES_GCM: 330d0620b01SJens Wiklander return crypto_aes_gcm_enc_final(ctx, src_data, src_len, 331d0620b01SJens Wiklander dst_data, dst_tag, dst_tag_len); 332d0620b01SJens Wiklander #endif 333d0620b01SJens Wiklander default: 3348875ce46SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 3358875ce46SJens Wiklander } 336d0620b01SJens Wiklander } 3378875ce46SJens Wiklander 338d0620b01SJens Wiklander TEE_Result crypto_authenc_dec_final(void *ctx __maybe_unused, 339d0620b01SJens Wiklander uint32_t algo __maybe_unused, 340d0620b01SJens Wiklander const uint8_t *src_data __maybe_unused, 341d0620b01SJens Wiklander size_t src_len __maybe_unused, 342d0620b01SJens Wiklander uint8_t *dst_data __maybe_unused, 343d0620b01SJens Wiklander size_t *dst_len __maybe_unused, 344d0620b01SJens Wiklander const uint8_t *tag __maybe_unused, 345d0620b01SJens Wiklander size_t tag_len __maybe_unused) 3468875ce46SJens Wiklander { 347d0620b01SJens Wiklander size_t dl = *dst_len; 348d0620b01SJens Wiklander 349d0620b01SJens Wiklander *dst_len = src_len; 350d0620b01SJens Wiklander if (dl < src_len) 351d0620b01SJens Wiklander return TEE_ERROR_SHORT_BUFFER; 352d0620b01SJens Wiklander 353d0620b01SJens Wiklander switch (algo) { 354d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM) 355d0620b01SJens Wiklander case TEE_ALG_AES_CCM: 356d0620b01SJens Wiklander return crypto_aes_ccm_dec_final(ctx, src_data, src_len, 357d0620b01SJens Wiklander dst_data, tag, tag_len); 358d0620b01SJens Wiklander #endif 359d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM) 360d0620b01SJens Wiklander case TEE_ALG_AES_GCM: 361d0620b01SJens Wiklander return crypto_aes_gcm_dec_final(ctx, src_data, src_len, 362d0620b01SJens Wiklander dst_data, tag, tag_len); 363d0620b01SJens Wiklander #endif 364d0620b01SJens Wiklander default: 3658875ce46SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 3668875ce46SJens Wiklander } 3678875ce46SJens Wiklander } 3688875ce46SJens Wiklander 369d0620b01SJens Wiklander void crypto_authenc_final(void *ctx __maybe_unused, 370d0620b01SJens Wiklander uint32_t algo __maybe_unused) 3718875ce46SJens Wiklander { 372d0620b01SJens Wiklander switch (algo) { 373d0620b01SJens Wiklander #if defined(CFG_CRYPTO_CCM) 374d0620b01SJens Wiklander case TEE_ALG_AES_CCM: 375d0620b01SJens Wiklander crypto_aes_ccm_final(ctx); 376d0620b01SJens Wiklander break; 377d0620b01SJens Wiklander #endif 378d0620b01SJens Wiklander #if defined(CFG_CRYPTO_GCM) 379d0620b01SJens Wiklander case TEE_ALG_AES_GCM: 380d0620b01SJens Wiklander crypto_aes_gcm_final(ctx); 381d0620b01SJens Wiklander break; 382d0620b01SJens Wiklander #endif 383d0620b01SJens Wiklander default: 384d0620b01SJens Wiklander break; 3858875ce46SJens Wiklander } 386d0620b01SJens Wiklander } 38733790cc1SJens Wiklander 38833790cc1SJens Wiklander #if !defined(_CFG_CRYPTO_WITH_ACIPHER) 38933790cc1SJens Wiklander struct bignum *crypto_bignum_allocate(size_t size_bits __unused) 39033790cc1SJens Wiklander { 39133790cc1SJens Wiklander return NULL; 39233790cc1SJens Wiklander } 39333790cc1SJens Wiklander 39433790cc1SJens Wiklander TEE_Result crypto_bignum_bin2bn(const uint8_t *from __unused, 39533790cc1SJens Wiklander size_t fromsize __unused, 39633790cc1SJens Wiklander struct bignum *to __unused) 39733790cc1SJens Wiklander { 39833790cc1SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 39933790cc1SJens Wiklander } 40033790cc1SJens Wiklander 40133790cc1SJens Wiklander size_t crypto_bignum_num_bytes(struct bignum *a __unused) 40233790cc1SJens Wiklander { 40333790cc1SJens Wiklander return 0; 40433790cc1SJens Wiklander } 40533790cc1SJens Wiklander 40633790cc1SJens Wiklander size_t crypto_bignum_num_bits(struct bignum *a __unused) 40733790cc1SJens Wiklander { 40833790cc1SJens Wiklander return 0; 40933790cc1SJens Wiklander } 41033790cc1SJens Wiklander 41133790cc1SJens Wiklander /* 41233790cc1SJens Wiklander * crypto_bignum_allocate() and crypto_bignum_bin2bn() failing should be 41333790cc1SJens Wiklander * enough to guarantee that the functions calling this function aren't 41433790cc1SJens Wiklander * called, but just in case add a panic() here to avoid unexpected 41533790cc1SJens Wiklander * behavoir. 41633790cc1SJens Wiklander */ 41733790cc1SJens Wiklander static void bignum_cant_happen(void) 41833790cc1SJens Wiklander { 41933790cc1SJens Wiklander volatile bool b = true; 42033790cc1SJens Wiklander 42133790cc1SJens Wiklander /* Avoid warning about function does not return */ 42233790cc1SJens Wiklander if (b) 42333790cc1SJens Wiklander panic(); 42433790cc1SJens Wiklander } 42533790cc1SJens Wiklander 42633790cc1SJens Wiklander void crypto_bignum_bn2bin(const struct bignum *from __unused, 42733790cc1SJens Wiklander uint8_t *to __unused) 42833790cc1SJens Wiklander { 42933790cc1SJens Wiklander bignum_cant_happen(); 43033790cc1SJens Wiklander } 43133790cc1SJens Wiklander 43233790cc1SJens Wiklander void crypto_bignum_copy(struct bignum *to __unused, 43333790cc1SJens Wiklander const struct bignum *from __unused) 43433790cc1SJens Wiklander { 43533790cc1SJens Wiklander bignum_cant_happen(); 43633790cc1SJens Wiklander } 43733790cc1SJens Wiklander 43833790cc1SJens Wiklander void crypto_bignum_free(struct bignum *a) 43933790cc1SJens Wiklander { 44033790cc1SJens Wiklander if (a) 44133790cc1SJens Wiklander panic(); 44233790cc1SJens Wiklander } 44333790cc1SJens Wiklander 44433790cc1SJens Wiklander void crypto_bignum_clear(struct bignum *a __unused) 44533790cc1SJens Wiklander { 44633790cc1SJens Wiklander bignum_cant_happen(); 44733790cc1SJens Wiklander } 44833790cc1SJens Wiklander 44933790cc1SJens Wiklander /* return -1 if a<b, 0 if a==b, +1 if a>b */ 45033790cc1SJens Wiklander int32_t crypto_bignum_compare(struct bignum *a __unused, 45133790cc1SJens Wiklander struct bignum *b __unused) 45233790cc1SJens Wiklander { 45333790cc1SJens Wiklander bignum_cant_happen(); 45433790cc1SJens Wiklander return -1; 45533790cc1SJens Wiklander } 45633790cc1SJens Wiklander #endif /*!_CFG_CRYPTO_WITH_ACIPHER*/ 457291e5450SJens Wiklander 458291e5450SJens Wiklander #if !defined(CFG_CRYPTO_RSA) || !defined(_CFG_CRYPTO_WITH_ACIPHER) 459291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_rsa_keypair(struct rsa_keypair *s __unused, 460291e5450SJens Wiklander size_t key_size_bits __unused) 461291e5450SJens Wiklander { 462291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 463291e5450SJens Wiklander } 464291e5450SJens Wiklander 465291e5450SJens Wiklander TEE_Result 466291e5450SJens Wiklander crypto_acipher_alloc_rsa_public_key(struct rsa_public_key *s __unused, 467291e5450SJens Wiklander size_t key_size_bits __unused) 468291e5450SJens Wiklander { 469291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 470291e5450SJens Wiklander } 471291e5450SJens Wiklander 472291e5450SJens Wiklander void crypto_acipher_free_rsa_public_key(struct rsa_public_key *s __unused) 473291e5450SJens Wiklander { 474291e5450SJens Wiklander } 475291e5450SJens Wiklander 476291e5450SJens Wiklander TEE_Result crypto_acipher_gen_rsa_key(struct rsa_keypair *key __unused, 477291e5450SJens Wiklander size_t key_size __unused) 478291e5450SJens Wiklander { 479291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 480291e5450SJens Wiklander } 481291e5450SJens Wiklander 482291e5450SJens Wiklander TEE_Result crypto_acipher_rsanopad_decrypt(struct rsa_keypair *key __unused, 483291e5450SJens Wiklander const uint8_t *src __unused, 484291e5450SJens Wiklander size_t src_len __unused, 485291e5450SJens Wiklander uint8_t *dst __unused, 486291e5450SJens Wiklander size_t *dst_len __unused) 487291e5450SJens Wiklander { 488291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 489291e5450SJens Wiklander } 490291e5450SJens Wiklander 491291e5450SJens Wiklander TEE_Result crypto_acipher_rsanopad_encrypt(struct rsa_public_key *key __unused, 492291e5450SJens Wiklander const uint8_t *src __unused, 493291e5450SJens Wiklander size_t src_len __unused, 494291e5450SJens Wiklander uint8_t *dst __unused, 495291e5450SJens Wiklander size_t *dst_len __unused) 496291e5450SJens Wiklander { 497291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 498291e5450SJens Wiklander } 499291e5450SJens Wiklander 500291e5450SJens Wiklander TEE_Result crypto_acipher_rsaes_decrypt(uint32_t algo __unused, 501291e5450SJens Wiklander struct rsa_keypair *key __unused, 502291e5450SJens Wiklander const uint8_t *label __unused, 503291e5450SJens Wiklander size_t label_len __unused, 504291e5450SJens Wiklander const uint8_t *src __unused, 505291e5450SJens Wiklander size_t src_len __unused, 506291e5450SJens Wiklander uint8_t *dst __unused, 507291e5450SJens Wiklander size_t *dst_len __unused) 508291e5450SJens Wiklander { 509291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 510291e5450SJens Wiklander } 511291e5450SJens Wiklander 512291e5450SJens Wiklander TEE_Result crypto_acipher_rsaes_encrypt(uint32_t algo __unused, 513291e5450SJens Wiklander struct rsa_public_key *key __unused, 514291e5450SJens Wiklander const uint8_t *label __unused, 515291e5450SJens Wiklander size_t label_len __unused, 516291e5450SJens Wiklander const uint8_t *src __unused, 517291e5450SJens Wiklander size_t src_len __unused, 518291e5450SJens Wiklander uint8_t *dst __unused, 519291e5450SJens Wiklander size_t *dst_len __unused) 520291e5450SJens Wiklander { 521291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 522291e5450SJens Wiklander } 523291e5450SJens Wiklander 524291e5450SJens Wiklander TEE_Result crypto_acipher_rsassa_sign(uint32_t algo __unused, 525291e5450SJens Wiklander struct rsa_keypair *key __unused, 526291e5450SJens Wiklander int salt_len __unused, 527291e5450SJens Wiklander const uint8_t *msg __unused, 528291e5450SJens Wiklander size_t msg_len __unused, 529291e5450SJens Wiklander uint8_t *sig __unused, 530291e5450SJens Wiklander size_t *sig_len __unused) 531291e5450SJens Wiklander { 532291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 533291e5450SJens Wiklander } 534291e5450SJens Wiklander 535291e5450SJens Wiklander TEE_Result crypto_acipher_rsassa_verify(uint32_t algo __unused, 536291e5450SJens Wiklander struct rsa_public_key *key __unused, 537291e5450SJens Wiklander int salt_len __unused, 538291e5450SJens Wiklander const uint8_t *msg __unused, 539291e5450SJens Wiklander size_t msg_len __unused, 540291e5450SJens Wiklander const uint8_t *sig __unused, 541291e5450SJens Wiklander size_t sig_len __unused) 542291e5450SJens Wiklander { 543291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 544291e5450SJens Wiklander } 545291e5450SJens Wiklander #endif /*!CFG_CRYPTO_RSA || !_CFG_CRYPTO_WITH_ACIPHER*/ 546291e5450SJens Wiklander 547291e5450SJens Wiklander #if !defined(CFG_CRYPTO_DSA) || !defined(_CFG_CRYPTO_WITH_ACIPHER) 548291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_dsa_keypair(struct dsa_keypair *s __unused, 549291e5450SJens Wiklander size_t key_size_bits __unused) 550291e5450SJens Wiklander { 551291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 552291e5450SJens Wiklander } 553291e5450SJens Wiklander 554291e5450SJens Wiklander TEE_Result 555291e5450SJens Wiklander crypto_acipher_alloc_dsa_public_key(struct dsa_public_key *s __unused, 556291e5450SJens Wiklander size_t key_size_bits __unused) 557291e5450SJens Wiklander { 558291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 559291e5450SJens Wiklander } 560291e5450SJens Wiklander 561291e5450SJens Wiklander TEE_Result crypto_acipher_gen_dsa_key(struct dsa_keypair *key __unused, 562291e5450SJens Wiklander size_t key_size __unused) 563291e5450SJens Wiklander { 564291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 565291e5450SJens Wiklander } 566291e5450SJens Wiklander 567291e5450SJens Wiklander TEE_Result crypto_acipher_dsa_sign(uint32_t algo __unused, 568291e5450SJens Wiklander struct dsa_keypair *key __unused, 569291e5450SJens Wiklander const uint8_t *msg __unused, 570291e5450SJens Wiklander size_t msg_len __unused, 571291e5450SJens Wiklander uint8_t *sig __unused, 572291e5450SJens Wiklander size_t *sig_len __unused) 573291e5450SJens Wiklander { 574291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 575291e5450SJens Wiklander } 576291e5450SJens Wiklander 577291e5450SJens Wiklander TEE_Result crypto_acipher_dsa_verify(uint32_t algo __unused, 578291e5450SJens Wiklander struct dsa_public_key *key __unused, 579291e5450SJens Wiklander const uint8_t *msg __unused, 580291e5450SJens Wiklander size_t msg_len __unused, 581291e5450SJens Wiklander const uint8_t *sig __unused, 582291e5450SJens Wiklander size_t sig_len __unused) 583291e5450SJens Wiklander { 584291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 585291e5450SJens Wiklander } 586291e5450SJens Wiklander #endif /*!CFG_CRYPTO_DSA || !_CFG_CRYPTO_WITH_ACIPHER*/ 587291e5450SJens Wiklander 588291e5450SJens Wiklander #if !defined(CFG_CRYPTO_DH) || !defined(_CFG_CRYPTO_WITH_ACIPHER) 589291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_dh_keypair(struct dh_keypair *s __unused, 590291e5450SJens Wiklander size_t key_size_bits __unused) 591291e5450SJens Wiklander { 592291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 593291e5450SJens Wiklander } 594291e5450SJens Wiklander 595291e5450SJens Wiklander TEE_Result crypto_acipher_gen_dh_key(struct dh_keypair *key __unused, 596291e5450SJens Wiklander struct bignum *q __unused, 597291e5450SJens Wiklander size_t xbits __unused) 598291e5450SJens Wiklander { 599291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 600291e5450SJens Wiklander } 601291e5450SJens Wiklander 602291e5450SJens Wiklander TEE_Result 603291e5450SJens Wiklander crypto_acipher_dh_shared_secret(struct dh_keypair *private_key __unused, 604291e5450SJens Wiklander struct bignum *public_key __unused, 605291e5450SJens Wiklander struct bignum *secret __unused) 606291e5450SJens Wiklander { 607291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 608291e5450SJens Wiklander } 609291e5450SJens Wiklander #endif /*!CFG_CRYPTO_DH || !_CFG_CRYPTO_WITH_ACIPHER*/ 610291e5450SJens Wiklander 611291e5450SJens Wiklander #if !defined(CFG_CRYPTO_ECC) || !defined(_CFG_CRYPTO_WITH_ACIPHER) 612291e5450SJens Wiklander TEE_Result 613291e5450SJens Wiklander crypto_acipher_alloc_ecc_public_key(struct ecc_public_key *s __unused, 614291e5450SJens Wiklander size_t key_size_bits __unused) 615291e5450SJens Wiklander { 616291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 617291e5450SJens Wiklander } 618291e5450SJens Wiklander 619291e5450SJens Wiklander TEE_Result crypto_acipher_alloc_ecc_keypair(struct ecc_keypair *s __unused, 620291e5450SJens Wiklander size_t key_size_bits __unused) 621291e5450SJens Wiklander { 622291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 623291e5450SJens Wiklander } 624291e5450SJens Wiklander 625291e5450SJens Wiklander void crypto_acipher_free_ecc_public_key(struct ecc_public_key *s __unused) 626291e5450SJens Wiklander { 627291e5450SJens Wiklander } 628291e5450SJens Wiklander 629291e5450SJens Wiklander TEE_Result crypto_acipher_gen_ecc_key(struct ecc_keypair *key __unused) 630291e5450SJens Wiklander { 631291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 632291e5450SJens Wiklander } 633291e5450SJens Wiklander 634291e5450SJens Wiklander TEE_Result crypto_acipher_ecc_sign(uint32_t algo __unused, 635291e5450SJens Wiklander struct ecc_keypair *key __unused, 636291e5450SJens Wiklander const uint8_t *msg __unused, 637291e5450SJens Wiklander size_t msg_len __unused, 638291e5450SJens Wiklander uint8_t *sig __unused, 639291e5450SJens Wiklander size_t *sig_len __unused) 640291e5450SJens Wiklander { 641291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 642291e5450SJens Wiklander } 643291e5450SJens Wiklander 644291e5450SJens Wiklander TEE_Result crypto_acipher_ecc_verify(uint32_t algo __unused, 645291e5450SJens Wiklander struct ecc_public_key *key __unused, 646291e5450SJens Wiklander const uint8_t *msg __unused, 647291e5450SJens Wiklander size_t msg_len __unused, 648291e5450SJens Wiklander const uint8_t *sig __unused, 649291e5450SJens Wiklander size_t sig_len __unused) 650291e5450SJens Wiklander { 651291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 652291e5450SJens Wiklander } 653291e5450SJens Wiklander 654291e5450SJens Wiklander TEE_Result 655291e5450SJens Wiklander crypto_acipher_ecc_shared_secret(struct ecc_keypair *private_key __unused, 656291e5450SJens Wiklander struct ecc_public_key *public_key __unused, 657291e5450SJens Wiklander void *secret __unused, 658291e5450SJens Wiklander unsigned long *secret_len __unused) 659291e5450SJens Wiklander { 660291e5450SJens Wiklander return TEE_ERROR_NOT_IMPLEMENTED; 661291e5450SJens Wiklander } 662291e5450SJens Wiklander #endif /*!CFG_CRYPTO_ECC || !_CFG_CRYPTO_WITH_ACIPHER*/ 663