1*2b716cccSEdison Ai // SPDX-License-Identifier: BSD-2-Clause 2*2b716cccSEdison Ai /* 3*2b716cccSEdison Ai * Copyright (C) 2018, ARM Limited 4*2b716cccSEdison Ai * Copyright (C) 2019, Linaro Limited 5*2b716cccSEdison Ai */ 6*2b716cccSEdison Ai 7*2b716cccSEdison Ai #include <assert.h> 8*2b716cccSEdison Ai #include <compiler.h> 9*2b716cccSEdison Ai #include <crypto/crypto.h> 10*2b716cccSEdison Ai #include <crypto/crypto_impl.h> 11*2b716cccSEdison Ai #include <kernel/panic.h> 12*2b716cccSEdison Ai #include <mbedtls/md.h> 13*2b716cccSEdison Ai #include <stdlib.h> 14*2b716cccSEdison Ai #include <string.h> 15*2b716cccSEdison Ai #include <tee_api_types.h> 16*2b716cccSEdison Ai #include <utee_defines.h> 17*2b716cccSEdison Ai #include <util.h> 18*2b716cccSEdison Ai 19*2b716cccSEdison Ai struct mbed_hmac_ctx { 20*2b716cccSEdison Ai struct crypto_mac_ctx mac_ctx; 21*2b716cccSEdison Ai mbedtls_md_context_t md_ctx; 22*2b716cccSEdison Ai }; 23*2b716cccSEdison Ai 24*2b716cccSEdison Ai static const struct crypto_mac_ops mbed_hmac_ops; 25*2b716cccSEdison Ai 26*2b716cccSEdison Ai static struct mbed_hmac_ctx *to_hmac_ctx(struct crypto_mac_ctx *ctx) 27*2b716cccSEdison Ai { 28*2b716cccSEdison Ai assert(ctx && ctx->ops == &mbed_hmac_ops); 29*2b716cccSEdison Ai 30*2b716cccSEdison Ai return container_of(ctx, struct mbed_hmac_ctx, mac_ctx); 31*2b716cccSEdison Ai } 32*2b716cccSEdison Ai 33*2b716cccSEdison Ai static TEE_Result mbed_hmac_init(struct crypto_mac_ctx *ctx, 34*2b716cccSEdison Ai const uint8_t *key, size_t len) 35*2b716cccSEdison Ai { 36*2b716cccSEdison Ai if (mbedtls_md_hmac_starts(&to_hmac_ctx(ctx)->md_ctx, key, len)) 37*2b716cccSEdison Ai return TEE_ERROR_BAD_STATE; 38*2b716cccSEdison Ai 39*2b716cccSEdison Ai return TEE_SUCCESS; 40*2b716cccSEdison Ai } 41*2b716cccSEdison Ai 42*2b716cccSEdison Ai static TEE_Result mbed_hmac_update(struct crypto_mac_ctx *ctx, 43*2b716cccSEdison Ai const uint8_t *data, size_t len) 44*2b716cccSEdison Ai { 45*2b716cccSEdison Ai if (mbedtls_md_hmac_update(&to_hmac_ctx(ctx)->md_ctx, data, len)) 46*2b716cccSEdison Ai return TEE_ERROR_BAD_STATE; 47*2b716cccSEdison Ai 48*2b716cccSEdison Ai return TEE_SUCCESS; 49*2b716cccSEdison Ai } 50*2b716cccSEdison Ai 51*2b716cccSEdison Ai static TEE_Result mbed_hmac_final(struct crypto_mac_ctx *ctx, uint8_t *digest, 52*2b716cccSEdison Ai size_t len) 53*2b716cccSEdison Ai { 54*2b716cccSEdison Ai struct mbed_hmac_ctx *c = to_hmac_ctx(ctx); 55*2b716cccSEdison Ai size_t hmac_size = mbedtls_md_get_size(c->md_ctx.md_info); 56*2b716cccSEdison Ai uint8_t block_digest[TEE_MAX_HASH_SIZE] = { 0 }; 57*2b716cccSEdison Ai uint8_t *tmp_digest = NULL; 58*2b716cccSEdison Ai 59*2b716cccSEdison Ai if (len == 0) 60*2b716cccSEdison Ai return TEE_ERROR_BAD_PARAMETERS; 61*2b716cccSEdison Ai 62*2b716cccSEdison Ai if (hmac_size > len) { 63*2b716cccSEdison Ai if (hmac_size > sizeof(block_digest)) 64*2b716cccSEdison Ai return TEE_ERROR_BAD_STATE; 65*2b716cccSEdison Ai tmp_digest = block_digest; /* use a tempory buffer */ 66*2b716cccSEdison Ai } else { 67*2b716cccSEdison Ai tmp_digest = digest; 68*2b716cccSEdison Ai } 69*2b716cccSEdison Ai 70*2b716cccSEdison Ai if (mbedtls_md_hmac_finish(&c->md_ctx, tmp_digest)) 71*2b716cccSEdison Ai return TEE_ERROR_BAD_STATE; 72*2b716cccSEdison Ai 73*2b716cccSEdison Ai if (hmac_size > len) 74*2b716cccSEdison Ai memcpy(digest, tmp_digest, len); 75*2b716cccSEdison Ai 76*2b716cccSEdison Ai return TEE_SUCCESS; 77*2b716cccSEdison Ai } 78*2b716cccSEdison Ai 79*2b716cccSEdison Ai static void mbed_hmac_free_ctx(struct crypto_mac_ctx *ctx) 80*2b716cccSEdison Ai { 81*2b716cccSEdison Ai struct mbed_hmac_ctx *c = to_hmac_ctx(ctx); 82*2b716cccSEdison Ai 83*2b716cccSEdison Ai mbedtls_md_free(&c->md_ctx); 84*2b716cccSEdison Ai free(c); 85*2b716cccSEdison Ai } 86*2b716cccSEdison Ai 87*2b716cccSEdison Ai static void mbed_hmac_copy_state(struct crypto_mac_ctx *dst_ctx, 88*2b716cccSEdison Ai struct crypto_mac_ctx *src_ctx) 89*2b716cccSEdison Ai { 90*2b716cccSEdison Ai struct mbed_hmac_ctx *src = to_hmac_ctx(src_ctx); 91*2b716cccSEdison Ai struct mbed_hmac_ctx *dst = to_hmac_ctx(dst_ctx); 92*2b716cccSEdison Ai 93*2b716cccSEdison Ai if (mbedtls_md_clone(&dst->md_ctx, &src->md_ctx)) 94*2b716cccSEdison Ai panic(); 95*2b716cccSEdison Ai } 96*2b716cccSEdison Ai 97*2b716cccSEdison Ai static const struct crypto_mac_ops mbed_hmac_ops = { 98*2b716cccSEdison Ai .init = mbed_hmac_init, 99*2b716cccSEdison Ai .update = mbed_hmac_update, 100*2b716cccSEdison Ai .final = mbed_hmac_final, 101*2b716cccSEdison Ai .free_ctx = mbed_hmac_free_ctx, 102*2b716cccSEdison Ai .copy_state = mbed_hmac_copy_state, 103*2b716cccSEdison Ai }; 104*2b716cccSEdison Ai 105*2b716cccSEdison Ai static TEE_Result mbed_hmac_alloc_ctx(struct crypto_mac_ctx **ctx_ret, 106*2b716cccSEdison Ai mbedtls_md_type_t md_type) 107*2b716cccSEdison Ai { 108*2b716cccSEdison Ai int mbed_res = 0; 109*2b716cccSEdison Ai struct mbed_hmac_ctx *c = NULL; 110*2b716cccSEdison Ai const mbedtls_md_info_t *md_info = mbedtls_md_info_from_type(md_type); 111*2b716cccSEdison Ai 112*2b716cccSEdison Ai if (!md_info) 113*2b716cccSEdison Ai return TEE_ERROR_NOT_SUPPORTED; 114*2b716cccSEdison Ai 115*2b716cccSEdison Ai c = calloc(1, sizeof(*c)); 116*2b716cccSEdison Ai if (!c) 117*2b716cccSEdison Ai return TEE_ERROR_OUT_OF_MEMORY; 118*2b716cccSEdison Ai 119*2b716cccSEdison Ai c->mac_ctx.ops = &mbed_hmac_ops; 120*2b716cccSEdison Ai mbed_res = mbedtls_md_setup(&c->md_ctx, md_info, 1); 121*2b716cccSEdison Ai if (mbed_res) { 122*2b716cccSEdison Ai free(c); 123*2b716cccSEdison Ai if (mbed_res == MBEDTLS_ERR_MD_ALLOC_FAILED) 124*2b716cccSEdison Ai return TEE_ERROR_OUT_OF_MEMORY; 125*2b716cccSEdison Ai return TEE_ERROR_NOT_SUPPORTED; 126*2b716cccSEdison Ai } 127*2b716cccSEdison Ai 128*2b716cccSEdison Ai *ctx_ret = &c->mac_ctx; 129*2b716cccSEdison Ai 130*2b716cccSEdison Ai return TEE_SUCCESS; 131*2b716cccSEdison Ai } 132*2b716cccSEdison Ai 133*2b716cccSEdison Ai #if defined(CFG_CRYPTO_MD5) 134*2b716cccSEdison Ai TEE_Result crypto_hmac_md5_alloc_ctx(struct crypto_mac_ctx **ctx) 135*2b716cccSEdison Ai { 136*2b716cccSEdison Ai return mbed_hmac_alloc_ctx(ctx, MBEDTLS_MD_MD5); 137*2b716cccSEdison Ai } 138*2b716cccSEdison Ai #endif 139*2b716cccSEdison Ai 140*2b716cccSEdison Ai #if defined(CFG_CRYPTO_SHA1) 141*2b716cccSEdison Ai TEE_Result crypto_hmac_sha1_alloc_ctx(struct crypto_mac_ctx **ctx) 142*2b716cccSEdison Ai { 143*2b716cccSEdison Ai return mbed_hmac_alloc_ctx(ctx, MBEDTLS_MD_SHA1); 144*2b716cccSEdison Ai } 145*2b716cccSEdison Ai #endif 146*2b716cccSEdison Ai 147*2b716cccSEdison Ai #if defined(CFG_CRYPTO_SHA224) 148*2b716cccSEdison Ai TEE_Result crypto_hmac_sha224_alloc_ctx(struct crypto_mac_ctx **ctx) 149*2b716cccSEdison Ai { 150*2b716cccSEdison Ai return mbed_hmac_alloc_ctx(ctx, MBEDTLS_MD_SHA224); 151*2b716cccSEdison Ai } 152*2b716cccSEdison Ai #endif 153*2b716cccSEdison Ai 154*2b716cccSEdison Ai #if defined(CFG_CRYPTO_SHA256) 155*2b716cccSEdison Ai TEE_Result crypto_hmac_sha256_alloc_ctx(struct crypto_mac_ctx **ctx) 156*2b716cccSEdison Ai { 157*2b716cccSEdison Ai return mbed_hmac_alloc_ctx(ctx, MBEDTLS_MD_SHA256); 158*2b716cccSEdison Ai } 159*2b716cccSEdison Ai #endif 160*2b716cccSEdison Ai 161*2b716cccSEdison Ai #if defined(CFG_CRYPTO_SHA384) 162*2b716cccSEdison Ai TEE_Result crypto_hmac_sha384_alloc_ctx(struct crypto_mac_ctx **ctx) 163*2b716cccSEdison Ai { 164*2b716cccSEdison Ai return mbed_hmac_alloc_ctx(ctx, MBEDTLS_MD_SHA384); 165*2b716cccSEdison Ai } 166*2b716cccSEdison Ai #endif 167*2b716cccSEdison Ai 168*2b716cccSEdison Ai #if defined(CFG_CRYPTO_SHA512) 169*2b716cccSEdison Ai TEE_Result crypto_hmac_sha512_alloc_ctx(struct crypto_mac_ctx **ctx) 170*2b716cccSEdison Ai { 171*2b716cccSEdison Ai return mbed_hmac_alloc_ctx(ctx, MBEDTLS_MD_SHA512); 172*2b716cccSEdison Ai } 173*2b716cccSEdison Ai #endif 174