xref: /optee_os/lib/libmbedtls/core/hmac.c (revision 2b716ccc528914f136d81ef361e0b44bc98266b2)
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