xref: /optee_os/core/crypto/sm3-hmac.c (revision 47645577c806e80b6477193eff5ebc7de710ddf2)
1*47645577SJerome Forissier // SPDX-License-Identifier: BSD-2-Clause
2*47645577SJerome Forissier /*
3*47645577SJerome Forissier  * Copyright (C) 2018, ARM Limited
4*47645577SJerome Forissier  * Copyright (C) 2019, Linaro Limited
5*47645577SJerome Forissier  */
6*47645577SJerome Forissier 
7*47645577SJerome Forissier #include <assert.h>
8*47645577SJerome Forissier #include <compiler.h>
9*47645577SJerome Forissier #include <crypto/crypto.h>
10*47645577SJerome Forissier #include <crypto/crypto_impl.h>
11*47645577SJerome Forissier #include <kernel/panic.h>
12*47645577SJerome Forissier #include <mbedtls/md.h>
13*47645577SJerome Forissier #include <stdlib.h>
14*47645577SJerome Forissier #include <string.h>
15*47645577SJerome Forissier #include <string_ext.h>
16*47645577SJerome Forissier #include <tee_api_types.h>
17*47645577SJerome Forissier #include <utee_defines.h>
18*47645577SJerome Forissier #include <util.h>
19*47645577SJerome Forissier 
20*47645577SJerome Forissier #include "sm3.h"
21*47645577SJerome Forissier 
22*47645577SJerome Forissier struct sm3_hmac_ctx {
23*47645577SJerome Forissier 	struct crypto_mac_ctx mac_ctx;
24*47645577SJerome Forissier 	struct sm3_context sm3_ctx;
25*47645577SJerome Forissier };
26*47645577SJerome Forissier 
27*47645577SJerome Forissier static const struct crypto_mac_ops sm3_hmac_ops;
28*47645577SJerome Forissier 
29*47645577SJerome Forissier static struct sm3_hmac_ctx *to_hmac_ctx(struct crypto_mac_ctx *ctx)
30*47645577SJerome Forissier {
31*47645577SJerome Forissier 	assert(ctx && ctx->ops == &sm3_hmac_ops);
32*47645577SJerome Forissier 
33*47645577SJerome Forissier 	return container_of(ctx, struct sm3_hmac_ctx, mac_ctx);
34*47645577SJerome Forissier }
35*47645577SJerome Forissier 
36*47645577SJerome Forissier static TEE_Result op_sm3_hmac_init(struct crypto_mac_ctx *ctx,
37*47645577SJerome Forissier 				 const uint8_t *key, size_t len)
38*47645577SJerome Forissier {
39*47645577SJerome Forissier 	sm3_hmac_init(&to_hmac_ctx(ctx)->sm3_ctx, key, len);
40*47645577SJerome Forissier 
41*47645577SJerome Forissier 	return TEE_SUCCESS;
42*47645577SJerome Forissier }
43*47645577SJerome Forissier 
44*47645577SJerome Forissier static TEE_Result op_sm3_hmac_update(struct crypto_mac_ctx *ctx,
45*47645577SJerome Forissier 				   const uint8_t *data, size_t len)
46*47645577SJerome Forissier {
47*47645577SJerome Forissier 	sm3_hmac_update(&to_hmac_ctx(ctx)->sm3_ctx, data, len);
48*47645577SJerome Forissier 
49*47645577SJerome Forissier 	return TEE_SUCCESS;
50*47645577SJerome Forissier }
51*47645577SJerome Forissier 
52*47645577SJerome Forissier static TEE_Result op_sm3_hmac_final(struct crypto_mac_ctx *ctx, uint8_t *digest,
53*47645577SJerome Forissier 				  size_t len)
54*47645577SJerome Forissier {
55*47645577SJerome Forissier 	struct sm3_hmac_ctx *c = to_hmac_ctx(ctx);
56*47645577SJerome Forissier 	size_t hmac_size = TEE_SM3_HASH_SIZE;
57*47645577SJerome Forissier 	uint8_t block_digest[TEE_SM3_HASH_SIZE] = { 0 };
58*47645577SJerome Forissier 	uint8_t *tmp_digest = NULL;
59*47645577SJerome Forissier 
60*47645577SJerome Forissier 	if (len == 0)
61*47645577SJerome Forissier 		return TEE_ERROR_BAD_PARAMETERS;
62*47645577SJerome Forissier 
63*47645577SJerome Forissier 	if (hmac_size > len)
64*47645577SJerome Forissier 		tmp_digest = block_digest; /* use a tempory buffer */
65*47645577SJerome Forissier 	else
66*47645577SJerome Forissier 		tmp_digest = digest;
67*47645577SJerome Forissier 
68*47645577SJerome Forissier 	sm3_hmac_final(&c->sm3_ctx, tmp_digest);
69*47645577SJerome Forissier 
70*47645577SJerome Forissier 	if (hmac_size > len)
71*47645577SJerome Forissier 		memcpy(digest, tmp_digest, len);
72*47645577SJerome Forissier 
73*47645577SJerome Forissier 	return TEE_SUCCESS;
74*47645577SJerome Forissier }
75*47645577SJerome Forissier 
76*47645577SJerome Forissier static void op_sm3_hmac_free_ctx(struct crypto_mac_ctx *ctx)
77*47645577SJerome Forissier {
78*47645577SJerome Forissier 	struct sm3_hmac_ctx *c = to_hmac_ctx(ctx);
79*47645577SJerome Forissier 
80*47645577SJerome Forissier 	memzero_explicit(&c->sm3_ctx, sizeof(c->sm3_ctx));
81*47645577SJerome Forissier 	free(c);
82*47645577SJerome Forissier }
83*47645577SJerome Forissier 
84*47645577SJerome Forissier static void op_sm3_hmac_copy_state(struct crypto_mac_ctx *dst_ctx,
85*47645577SJerome Forissier 				 struct crypto_mac_ctx *src_ctx)
86*47645577SJerome Forissier {
87*47645577SJerome Forissier 	struct sm3_hmac_ctx *src = to_hmac_ctx(src_ctx);
88*47645577SJerome Forissier 	struct sm3_hmac_ctx *dst = to_hmac_ctx(dst_ctx);
89*47645577SJerome Forissier 
90*47645577SJerome Forissier 	dst->sm3_ctx = src->sm3_ctx;
91*47645577SJerome Forissier }
92*47645577SJerome Forissier 
93*47645577SJerome Forissier static const struct crypto_mac_ops sm3_hmac_ops = {
94*47645577SJerome Forissier 	.init = op_sm3_hmac_init,
95*47645577SJerome Forissier 	.update = op_sm3_hmac_update,
96*47645577SJerome Forissier 	.final = op_sm3_hmac_final,
97*47645577SJerome Forissier 	.free_ctx = op_sm3_hmac_free_ctx,
98*47645577SJerome Forissier 	.copy_state = op_sm3_hmac_copy_state,
99*47645577SJerome Forissier };
100*47645577SJerome Forissier 
101*47645577SJerome Forissier TEE_Result crypto_hmac_sm3_alloc_ctx(struct crypto_mac_ctx **ctx)
102*47645577SJerome Forissier {
103*47645577SJerome Forissier 	struct sm3_hmac_ctx *c = NULL;
104*47645577SJerome Forissier 
105*47645577SJerome Forissier 	c = calloc(1, sizeof(*c));
106*47645577SJerome Forissier 	if (!c)
107*47645577SJerome Forissier 		return TEE_ERROR_OUT_OF_MEMORY;
108*47645577SJerome Forissier 
109*47645577SJerome Forissier 	c->mac_ctx.ops = &sm3_hmac_ops;
110*47645577SJerome Forissier 
111*47645577SJerome Forissier 	*ctx = &c->mac_ctx;
112*47645577SJerome Forissier 
113*47645577SJerome Forissier 	return TEE_SUCCESS;
114*47645577SJerome Forissier }
115