1a8e1175bSopenharmony_ci/**
2a8e1175bSopenharmony_ci * \file md.c
3a8e1175bSopenharmony_ci *
4a8e1175bSopenharmony_ci * \brief Generic message digest wrapper for Mbed TLS
5a8e1175bSopenharmony_ci *
6a8e1175bSopenharmony_ci * \author Adriaan de Jong <dejong@fox-it.com>
7a8e1175bSopenharmony_ci *
8a8e1175bSopenharmony_ci *  Copyright The Mbed TLS Contributors
9a8e1175bSopenharmony_ci *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
10a8e1175bSopenharmony_ci */
11a8e1175bSopenharmony_ci
12a8e1175bSopenharmony_ci#include "common.h"
13a8e1175bSopenharmony_ci
14a8e1175bSopenharmony_ci/*
15a8e1175bSopenharmony_ci * Availability of functions in this module is controlled by two
16a8e1175bSopenharmony_ci * feature macros:
17a8e1175bSopenharmony_ci * - MBEDTLS_MD_C enables the whole module;
18a8e1175bSopenharmony_ci * - MBEDTLS_MD_LIGHT enables only functions for hashing and accessing
19a8e1175bSopenharmony_ci * most hash metadata (everything except string names); is it
20a8e1175bSopenharmony_ci * automatically set whenever MBEDTLS_MD_C is defined.
21a8e1175bSopenharmony_ci *
22a8e1175bSopenharmony_ci * In this file, functions from MD_LIGHT are at the top, MD_C at the end.
23a8e1175bSopenharmony_ci *
24a8e1175bSopenharmony_ci * In the future we may want to change the contract of some functions
25a8e1175bSopenharmony_ci * (behaviour with NULL arguments) depending on whether MD_C is defined or
26a8e1175bSopenharmony_ci * only MD_LIGHT. Also, the exact scope of MD_LIGHT might vary.
27a8e1175bSopenharmony_ci *
28a8e1175bSopenharmony_ci * For these reasons, we're keeping MD_LIGHT internal for now.
29a8e1175bSopenharmony_ci */
30a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_LIGHT)
31a8e1175bSopenharmony_ci
32a8e1175bSopenharmony_ci#include "mbedtls/md.h"
33a8e1175bSopenharmony_ci#include "md_wrap.h"
34a8e1175bSopenharmony_ci#include "mbedtls/platform_util.h"
35a8e1175bSopenharmony_ci#include "mbedtls/error.h"
36a8e1175bSopenharmony_ci
37a8e1175bSopenharmony_ci#include "mbedtls/md5.h"
38a8e1175bSopenharmony_ci#include "mbedtls/ripemd160.h"
39a8e1175bSopenharmony_ci#include "mbedtls/sha1.h"
40a8e1175bSopenharmony_ci#include "mbedtls/sha256.h"
41a8e1175bSopenharmony_ci#include "mbedtls/sha512.h"
42a8e1175bSopenharmony_ci#include "mbedtls/sha3.h"
43a8e1175bSopenharmony_ci
44a8e1175bSopenharmony_ci#if defined(MBEDTLS_PSA_CRYPTO_C)
45a8e1175bSopenharmony_ci#include <psa/crypto.h>
46a8e1175bSopenharmony_ci#include "md_psa.h"
47a8e1175bSopenharmony_ci#include "psa_util_internal.h"
48a8e1175bSopenharmony_ci#endif
49a8e1175bSopenharmony_ci
50a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_SOME_PSA)
51a8e1175bSopenharmony_ci#include "psa_crypto_core.h"
52a8e1175bSopenharmony_ci#endif
53a8e1175bSopenharmony_ci
54a8e1175bSopenharmony_ci#include "mbedtls/platform.h"
55a8e1175bSopenharmony_ci
56a8e1175bSopenharmony_ci#include <string.h>
57a8e1175bSopenharmony_ci
58a8e1175bSopenharmony_ci#if defined(MBEDTLS_FS_IO)
59a8e1175bSopenharmony_ci#include <stdio.h>
60a8e1175bSopenharmony_ci#endif
61a8e1175bSopenharmony_ci
62a8e1175bSopenharmony_ci/* See comment above MBEDTLS_MD_MAX_SIZE in md.h */
63a8e1175bSopenharmony_ci#if defined(MBEDTLS_PSA_CRYPTO_C) && MBEDTLS_MD_MAX_SIZE < PSA_HASH_MAX_SIZE
64a8e1175bSopenharmony_ci#error "Internal error: MBEDTLS_MD_MAX_SIZE < PSA_HASH_MAX_SIZE"
65a8e1175bSopenharmony_ci#endif
66a8e1175bSopenharmony_ci
67a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_C)
68a8e1175bSopenharmony_ci#define MD_INFO(type, out_size, block_size) type, out_size, block_size,
69a8e1175bSopenharmony_ci#else
70a8e1175bSopenharmony_ci#define MD_INFO(type, out_size, block_size) type, out_size,
71a8e1175bSopenharmony_ci#endif
72a8e1175bSopenharmony_ci
73a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_MD5)
74a8e1175bSopenharmony_cistatic const mbedtls_md_info_t mbedtls_md5_info = {
75a8e1175bSopenharmony_ci    MD_INFO(MBEDTLS_MD_MD5, 16, 64)
76a8e1175bSopenharmony_ci};
77a8e1175bSopenharmony_ci#endif
78a8e1175bSopenharmony_ci
79a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_RIPEMD160)
80a8e1175bSopenharmony_cistatic const mbedtls_md_info_t mbedtls_ripemd160_info = {
81a8e1175bSopenharmony_ci    MD_INFO(MBEDTLS_MD_RIPEMD160, 20, 64)
82a8e1175bSopenharmony_ci};
83a8e1175bSopenharmony_ci#endif
84a8e1175bSopenharmony_ci
85a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA1)
86a8e1175bSopenharmony_cistatic const mbedtls_md_info_t mbedtls_sha1_info = {
87a8e1175bSopenharmony_ci    MD_INFO(MBEDTLS_MD_SHA1, 20, 64)
88a8e1175bSopenharmony_ci};
89a8e1175bSopenharmony_ci#endif
90a8e1175bSopenharmony_ci
91a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA224)
92a8e1175bSopenharmony_cistatic const mbedtls_md_info_t mbedtls_sha224_info = {
93a8e1175bSopenharmony_ci    MD_INFO(MBEDTLS_MD_SHA224, 28, 64)
94a8e1175bSopenharmony_ci};
95a8e1175bSopenharmony_ci#endif
96a8e1175bSopenharmony_ci
97a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA256)
98a8e1175bSopenharmony_cistatic const mbedtls_md_info_t mbedtls_sha256_info = {
99a8e1175bSopenharmony_ci    MD_INFO(MBEDTLS_MD_SHA256, 32, 64)
100a8e1175bSopenharmony_ci};
101a8e1175bSopenharmony_ci#endif
102a8e1175bSopenharmony_ci
103a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA384)
104a8e1175bSopenharmony_cistatic const mbedtls_md_info_t mbedtls_sha384_info = {
105a8e1175bSopenharmony_ci    MD_INFO(MBEDTLS_MD_SHA384, 48, 128)
106a8e1175bSopenharmony_ci};
107a8e1175bSopenharmony_ci#endif
108a8e1175bSopenharmony_ci
109a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA512)
110a8e1175bSopenharmony_cistatic const mbedtls_md_info_t mbedtls_sha512_info = {
111a8e1175bSopenharmony_ci    MD_INFO(MBEDTLS_MD_SHA512, 64, 128)
112a8e1175bSopenharmony_ci};
113a8e1175bSopenharmony_ci#endif
114a8e1175bSopenharmony_ci
115a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA3_224)
116a8e1175bSopenharmony_cistatic const mbedtls_md_info_t mbedtls_sha3_224_info = {
117a8e1175bSopenharmony_ci    MD_INFO(MBEDTLS_MD_SHA3_224, 28, 144)
118a8e1175bSopenharmony_ci};
119a8e1175bSopenharmony_ci#endif
120a8e1175bSopenharmony_ci
121a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA3_256)
122a8e1175bSopenharmony_cistatic const mbedtls_md_info_t mbedtls_sha3_256_info = {
123a8e1175bSopenharmony_ci    MD_INFO(MBEDTLS_MD_SHA3_256, 32, 136)
124a8e1175bSopenharmony_ci};
125a8e1175bSopenharmony_ci#endif
126a8e1175bSopenharmony_ci
127a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA3_384)
128a8e1175bSopenharmony_cistatic const mbedtls_md_info_t mbedtls_sha3_384_info = {
129a8e1175bSopenharmony_ci    MD_INFO(MBEDTLS_MD_SHA3_384, 48, 104)
130a8e1175bSopenharmony_ci};
131a8e1175bSopenharmony_ci#endif
132a8e1175bSopenharmony_ci
133a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA3_512)
134a8e1175bSopenharmony_cistatic const mbedtls_md_info_t mbedtls_sha3_512_info = {
135a8e1175bSopenharmony_ci    MD_INFO(MBEDTLS_MD_SHA3_512, 64, 72)
136a8e1175bSopenharmony_ci};
137a8e1175bSopenharmony_ci#endif
138a8e1175bSopenharmony_ci
139a8e1175bSopenharmony_ciconst mbedtls_md_info_t *mbedtls_md_info_from_type(mbedtls_md_type_t md_type)
140a8e1175bSopenharmony_ci{
141a8e1175bSopenharmony_ci    switch (md_type) {
142a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_MD5)
143a8e1175bSopenharmony_ci        case MBEDTLS_MD_MD5:
144a8e1175bSopenharmony_ci            return &mbedtls_md5_info;
145a8e1175bSopenharmony_ci#endif
146a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_RIPEMD160)
147a8e1175bSopenharmony_ci        case MBEDTLS_MD_RIPEMD160:
148a8e1175bSopenharmony_ci            return &mbedtls_ripemd160_info;
149a8e1175bSopenharmony_ci#endif
150a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA1)
151a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA1:
152a8e1175bSopenharmony_ci            return &mbedtls_sha1_info;
153a8e1175bSopenharmony_ci#endif
154a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA224)
155a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA224:
156a8e1175bSopenharmony_ci            return &mbedtls_sha224_info;
157a8e1175bSopenharmony_ci#endif
158a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA256)
159a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA256:
160a8e1175bSopenharmony_ci            return &mbedtls_sha256_info;
161a8e1175bSopenharmony_ci#endif
162a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA384)
163a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA384:
164a8e1175bSopenharmony_ci            return &mbedtls_sha384_info;
165a8e1175bSopenharmony_ci#endif
166a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA512)
167a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA512:
168a8e1175bSopenharmony_ci            return &mbedtls_sha512_info;
169a8e1175bSopenharmony_ci#endif
170a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA3_224)
171a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_224:
172a8e1175bSopenharmony_ci            return &mbedtls_sha3_224_info;
173a8e1175bSopenharmony_ci#endif
174a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA3_256)
175a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_256:
176a8e1175bSopenharmony_ci            return &mbedtls_sha3_256_info;
177a8e1175bSopenharmony_ci#endif
178a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA3_384)
179a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_384:
180a8e1175bSopenharmony_ci            return &mbedtls_sha3_384_info;
181a8e1175bSopenharmony_ci#endif
182a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA3_512)
183a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_512:
184a8e1175bSopenharmony_ci            return &mbedtls_sha3_512_info;
185a8e1175bSopenharmony_ci#endif
186a8e1175bSopenharmony_ci        default:
187a8e1175bSopenharmony_ci            return NULL;
188a8e1175bSopenharmony_ci    }
189a8e1175bSopenharmony_ci}
190a8e1175bSopenharmony_ci
191a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_SOME_PSA)
192a8e1175bSopenharmony_cistatic psa_algorithm_t psa_alg_of_md(const mbedtls_md_info_t *info)
193a8e1175bSopenharmony_ci{
194a8e1175bSopenharmony_ci    switch (info->type) {
195a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_MD5_VIA_PSA)
196a8e1175bSopenharmony_ci        case MBEDTLS_MD_MD5:
197a8e1175bSopenharmony_ci            return PSA_ALG_MD5;
198a8e1175bSopenharmony_ci#endif
199a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_RIPEMD160_VIA_PSA)
200a8e1175bSopenharmony_ci        case MBEDTLS_MD_RIPEMD160:
201a8e1175bSopenharmony_ci            return PSA_ALG_RIPEMD160;
202a8e1175bSopenharmony_ci#endif
203a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_SHA1_VIA_PSA)
204a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA1:
205a8e1175bSopenharmony_ci            return PSA_ALG_SHA_1;
206a8e1175bSopenharmony_ci#endif
207a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_SHA224_VIA_PSA)
208a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA224:
209a8e1175bSopenharmony_ci            return PSA_ALG_SHA_224;
210a8e1175bSopenharmony_ci#endif
211a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_SHA256_VIA_PSA)
212a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA256:
213a8e1175bSopenharmony_ci            return PSA_ALG_SHA_256;
214a8e1175bSopenharmony_ci#endif
215a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_SHA384_VIA_PSA)
216a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA384:
217a8e1175bSopenharmony_ci            return PSA_ALG_SHA_384;
218a8e1175bSopenharmony_ci#endif
219a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_SHA512_VIA_PSA)
220a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA512:
221a8e1175bSopenharmony_ci            return PSA_ALG_SHA_512;
222a8e1175bSopenharmony_ci#endif
223a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_SHA3_224_VIA_PSA)
224a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_224:
225a8e1175bSopenharmony_ci            return PSA_ALG_SHA3_224;
226a8e1175bSopenharmony_ci#endif
227a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_SHA3_256_VIA_PSA)
228a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_256:
229a8e1175bSopenharmony_ci            return PSA_ALG_SHA3_256;
230a8e1175bSopenharmony_ci#endif
231a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_SHA3_384_VIA_PSA)
232a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_384:
233a8e1175bSopenharmony_ci            return PSA_ALG_SHA3_384;
234a8e1175bSopenharmony_ci#endif
235a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_SHA3_512_VIA_PSA)
236a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_512:
237a8e1175bSopenharmony_ci            return PSA_ALG_SHA3_512;
238a8e1175bSopenharmony_ci#endif
239a8e1175bSopenharmony_ci        default:
240a8e1175bSopenharmony_ci            return PSA_ALG_NONE;
241a8e1175bSopenharmony_ci    }
242a8e1175bSopenharmony_ci}
243a8e1175bSopenharmony_ci
244a8e1175bSopenharmony_cistatic int md_can_use_psa(const mbedtls_md_info_t *info)
245a8e1175bSopenharmony_ci{
246a8e1175bSopenharmony_ci    psa_algorithm_t alg = psa_alg_of_md(info);
247a8e1175bSopenharmony_ci    if (alg == PSA_ALG_NONE) {
248a8e1175bSopenharmony_ci        return 0;
249a8e1175bSopenharmony_ci    }
250a8e1175bSopenharmony_ci
251a8e1175bSopenharmony_ci    return psa_can_do_hash(alg);
252a8e1175bSopenharmony_ci}
253a8e1175bSopenharmony_ci#endif /* MBEDTLS_MD_SOME_PSA */
254a8e1175bSopenharmony_ci
255a8e1175bSopenharmony_civoid mbedtls_md_init(mbedtls_md_context_t *ctx)
256a8e1175bSopenharmony_ci{
257a8e1175bSopenharmony_ci    /* Note: this sets engine (if present) to MBEDTLS_MD_ENGINE_LEGACY */
258a8e1175bSopenharmony_ci    memset(ctx, 0, sizeof(mbedtls_md_context_t));
259a8e1175bSopenharmony_ci}
260a8e1175bSopenharmony_ci
261a8e1175bSopenharmony_civoid mbedtls_md_free(mbedtls_md_context_t *ctx)
262a8e1175bSopenharmony_ci{
263a8e1175bSopenharmony_ci    if (ctx == NULL || ctx->md_info == NULL) {
264a8e1175bSopenharmony_ci        return;
265a8e1175bSopenharmony_ci    }
266a8e1175bSopenharmony_ci
267a8e1175bSopenharmony_ci    if (ctx->md_ctx != NULL) {
268a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_SOME_PSA)
269a8e1175bSopenharmony_ci        if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
270a8e1175bSopenharmony_ci            psa_hash_abort(ctx->md_ctx);
271a8e1175bSopenharmony_ci        } else
272a8e1175bSopenharmony_ci#endif
273a8e1175bSopenharmony_ci        switch (ctx->md_info->type) {
274a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD5_C)
275a8e1175bSopenharmony_ci            case MBEDTLS_MD_MD5:
276a8e1175bSopenharmony_ci                mbedtls_md5_free(ctx->md_ctx);
277a8e1175bSopenharmony_ci                break;
278a8e1175bSopenharmony_ci#endif
279a8e1175bSopenharmony_ci#if defined(MBEDTLS_RIPEMD160_C)
280a8e1175bSopenharmony_ci            case MBEDTLS_MD_RIPEMD160:
281a8e1175bSopenharmony_ci                mbedtls_ripemd160_free(ctx->md_ctx);
282a8e1175bSopenharmony_ci                break;
283a8e1175bSopenharmony_ci#endif
284a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA1_C)
285a8e1175bSopenharmony_ci            case MBEDTLS_MD_SHA1:
286a8e1175bSopenharmony_ci                mbedtls_sha1_free(ctx->md_ctx);
287a8e1175bSopenharmony_ci                break;
288a8e1175bSopenharmony_ci#endif
289a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA224_C)
290a8e1175bSopenharmony_ci            case MBEDTLS_MD_SHA224:
291a8e1175bSopenharmony_ci                mbedtls_sha256_free(ctx->md_ctx);
292a8e1175bSopenharmony_ci                break;
293a8e1175bSopenharmony_ci#endif
294a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA256_C)
295a8e1175bSopenharmony_ci            case MBEDTLS_MD_SHA256:
296a8e1175bSopenharmony_ci                mbedtls_sha256_free(ctx->md_ctx);
297a8e1175bSopenharmony_ci                break;
298a8e1175bSopenharmony_ci#endif
299a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA384_C)
300a8e1175bSopenharmony_ci            case MBEDTLS_MD_SHA384:
301a8e1175bSopenharmony_ci                mbedtls_sha512_free(ctx->md_ctx);
302a8e1175bSopenharmony_ci                break;
303a8e1175bSopenharmony_ci#endif
304a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA512_C)
305a8e1175bSopenharmony_ci            case MBEDTLS_MD_SHA512:
306a8e1175bSopenharmony_ci                mbedtls_sha512_free(ctx->md_ctx);
307a8e1175bSopenharmony_ci                break;
308a8e1175bSopenharmony_ci#endif
309a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA3_C)
310a8e1175bSopenharmony_ci            case MBEDTLS_MD_SHA3_224:
311a8e1175bSopenharmony_ci            case MBEDTLS_MD_SHA3_256:
312a8e1175bSopenharmony_ci            case MBEDTLS_MD_SHA3_384:
313a8e1175bSopenharmony_ci            case MBEDTLS_MD_SHA3_512:
314a8e1175bSopenharmony_ci                mbedtls_sha3_free(ctx->md_ctx);
315a8e1175bSopenharmony_ci                break;
316a8e1175bSopenharmony_ci#endif
317a8e1175bSopenharmony_ci            default:
318a8e1175bSopenharmony_ci                /* Shouldn't happen */
319a8e1175bSopenharmony_ci                break;
320a8e1175bSopenharmony_ci        }
321a8e1175bSopenharmony_ci        mbedtls_free(ctx->md_ctx);
322a8e1175bSopenharmony_ci    }
323a8e1175bSopenharmony_ci
324a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_C)
325a8e1175bSopenharmony_ci    if (ctx->hmac_ctx != NULL) {
326a8e1175bSopenharmony_ci        mbedtls_zeroize_and_free(ctx->hmac_ctx,
327a8e1175bSopenharmony_ci                                 2 * ctx->md_info->block_size);
328a8e1175bSopenharmony_ci    }
329a8e1175bSopenharmony_ci#endif
330a8e1175bSopenharmony_ci
331a8e1175bSopenharmony_ci    mbedtls_platform_zeroize(ctx, sizeof(mbedtls_md_context_t));
332a8e1175bSopenharmony_ci}
333a8e1175bSopenharmony_ci
334a8e1175bSopenharmony_ciint mbedtls_md_clone(mbedtls_md_context_t *dst,
335a8e1175bSopenharmony_ci                     const mbedtls_md_context_t *src)
336a8e1175bSopenharmony_ci{
337a8e1175bSopenharmony_ci    if (dst == NULL || dst->md_info == NULL ||
338a8e1175bSopenharmony_ci        src == NULL || src->md_info == NULL ||
339a8e1175bSopenharmony_ci        dst->md_info != src->md_info) {
340a8e1175bSopenharmony_ci        return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
341a8e1175bSopenharmony_ci    }
342a8e1175bSopenharmony_ci
343a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_SOME_PSA)
344a8e1175bSopenharmony_ci    if (src->engine != dst->engine) {
345a8e1175bSopenharmony_ci        /* This can happen with src set to legacy because PSA wasn't ready
346a8e1175bSopenharmony_ci         * yet, and dst to PSA because it became ready in the meantime.
347a8e1175bSopenharmony_ci         * We currently don't support that case (we'd need to re-allocate
348a8e1175bSopenharmony_ci         * md_ctx to the size of the appropriate MD context). */
349a8e1175bSopenharmony_ci        return MBEDTLS_ERR_MD_FEATURE_UNAVAILABLE;
350a8e1175bSopenharmony_ci    }
351a8e1175bSopenharmony_ci
352a8e1175bSopenharmony_ci    if (src->engine == MBEDTLS_MD_ENGINE_PSA) {
353a8e1175bSopenharmony_ci        psa_status_t status = psa_hash_clone(src->md_ctx, dst->md_ctx);
354a8e1175bSopenharmony_ci        return mbedtls_md_error_from_psa(status);
355a8e1175bSopenharmony_ci    }
356a8e1175bSopenharmony_ci#endif
357a8e1175bSopenharmony_ci
358a8e1175bSopenharmony_ci    switch (src->md_info->type) {
359a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD5_C)
360a8e1175bSopenharmony_ci        case MBEDTLS_MD_MD5:
361a8e1175bSopenharmony_ci            mbedtls_md5_clone(dst->md_ctx, src->md_ctx);
362a8e1175bSopenharmony_ci            break;
363a8e1175bSopenharmony_ci#endif
364a8e1175bSopenharmony_ci#if defined(MBEDTLS_RIPEMD160_C)
365a8e1175bSopenharmony_ci        case MBEDTLS_MD_RIPEMD160:
366a8e1175bSopenharmony_ci            mbedtls_ripemd160_clone(dst->md_ctx, src->md_ctx);
367a8e1175bSopenharmony_ci            break;
368a8e1175bSopenharmony_ci#endif
369a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA1_C)
370a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA1:
371a8e1175bSopenharmony_ci            mbedtls_sha1_clone(dst->md_ctx, src->md_ctx);
372a8e1175bSopenharmony_ci            break;
373a8e1175bSopenharmony_ci#endif
374a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA224_C)
375a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA224:
376a8e1175bSopenharmony_ci            mbedtls_sha256_clone(dst->md_ctx, src->md_ctx);
377a8e1175bSopenharmony_ci            break;
378a8e1175bSopenharmony_ci#endif
379a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA256_C)
380a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA256:
381a8e1175bSopenharmony_ci            mbedtls_sha256_clone(dst->md_ctx, src->md_ctx);
382a8e1175bSopenharmony_ci            break;
383a8e1175bSopenharmony_ci#endif
384a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA384_C)
385a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA384:
386a8e1175bSopenharmony_ci            mbedtls_sha512_clone(dst->md_ctx, src->md_ctx);
387a8e1175bSopenharmony_ci            break;
388a8e1175bSopenharmony_ci#endif
389a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA512_C)
390a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA512:
391a8e1175bSopenharmony_ci            mbedtls_sha512_clone(dst->md_ctx, src->md_ctx);
392a8e1175bSopenharmony_ci            break;
393a8e1175bSopenharmony_ci#endif
394a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA3_C)
395a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_224:
396a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_256:
397a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_384:
398a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_512:
399a8e1175bSopenharmony_ci            mbedtls_sha3_clone(dst->md_ctx, src->md_ctx);
400a8e1175bSopenharmony_ci            break;
401a8e1175bSopenharmony_ci#endif
402a8e1175bSopenharmony_ci        default:
403a8e1175bSopenharmony_ci            return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
404a8e1175bSopenharmony_ci    }
405a8e1175bSopenharmony_ci
406a8e1175bSopenharmony_ci    return 0;
407a8e1175bSopenharmony_ci}
408a8e1175bSopenharmony_ci
409a8e1175bSopenharmony_ci#define ALLOC(type)                                                   \
410a8e1175bSopenharmony_ci    do {                                                                \
411a8e1175bSopenharmony_ci        ctx->md_ctx = mbedtls_calloc(1, sizeof(mbedtls_##type##_context)); \
412a8e1175bSopenharmony_ci        if (ctx->md_ctx == NULL)                                       \
413a8e1175bSopenharmony_ci        return MBEDTLS_ERR_MD_ALLOC_FAILED;                      \
414a8e1175bSopenharmony_ci        mbedtls_##type##_init(ctx->md_ctx);                           \
415a8e1175bSopenharmony_ci    }                                                                   \
416a8e1175bSopenharmony_ci    while (0)
417a8e1175bSopenharmony_ci
418a8e1175bSopenharmony_ciint mbedtls_md_setup(mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac)
419a8e1175bSopenharmony_ci{
420a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_C)
421a8e1175bSopenharmony_ci    if (ctx == NULL) {
422a8e1175bSopenharmony_ci        return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
423a8e1175bSopenharmony_ci    }
424a8e1175bSopenharmony_ci#endif
425a8e1175bSopenharmony_ci    if (md_info == NULL) {
426a8e1175bSopenharmony_ci        return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
427a8e1175bSopenharmony_ci    }
428a8e1175bSopenharmony_ci
429a8e1175bSopenharmony_ci    ctx->md_info = md_info;
430a8e1175bSopenharmony_ci    ctx->md_ctx = NULL;
431a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_C)
432a8e1175bSopenharmony_ci    ctx->hmac_ctx = NULL;
433a8e1175bSopenharmony_ci#else
434a8e1175bSopenharmony_ci    if (hmac != 0) {
435a8e1175bSopenharmony_ci        return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
436a8e1175bSopenharmony_ci    }
437a8e1175bSopenharmony_ci#endif
438a8e1175bSopenharmony_ci
439a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_SOME_PSA)
440a8e1175bSopenharmony_ci    if (md_can_use_psa(ctx->md_info)) {
441a8e1175bSopenharmony_ci        ctx->md_ctx = mbedtls_calloc(1, sizeof(psa_hash_operation_t));
442a8e1175bSopenharmony_ci        if (ctx->md_ctx == NULL) {
443a8e1175bSopenharmony_ci            return MBEDTLS_ERR_MD_ALLOC_FAILED;
444a8e1175bSopenharmony_ci        }
445a8e1175bSopenharmony_ci        ctx->engine = MBEDTLS_MD_ENGINE_PSA;
446a8e1175bSopenharmony_ci    } else
447a8e1175bSopenharmony_ci#endif
448a8e1175bSopenharmony_ci    switch (md_info->type) {
449a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD5_C)
450a8e1175bSopenharmony_ci        case MBEDTLS_MD_MD5:
451a8e1175bSopenharmony_ci            ALLOC(md5);
452a8e1175bSopenharmony_ci            break;
453a8e1175bSopenharmony_ci#endif
454a8e1175bSopenharmony_ci#if defined(MBEDTLS_RIPEMD160_C)
455a8e1175bSopenharmony_ci        case MBEDTLS_MD_RIPEMD160:
456a8e1175bSopenharmony_ci            ALLOC(ripemd160);
457a8e1175bSopenharmony_ci            break;
458a8e1175bSopenharmony_ci#endif
459a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA1_C)
460a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA1:
461a8e1175bSopenharmony_ci            ALLOC(sha1);
462a8e1175bSopenharmony_ci            break;
463a8e1175bSopenharmony_ci#endif
464a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA224_C)
465a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA224:
466a8e1175bSopenharmony_ci            ALLOC(sha256);
467a8e1175bSopenharmony_ci            break;
468a8e1175bSopenharmony_ci#endif
469a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA256_C)
470a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA256:
471a8e1175bSopenharmony_ci            ALLOC(sha256);
472a8e1175bSopenharmony_ci            break;
473a8e1175bSopenharmony_ci#endif
474a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA384_C)
475a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA384:
476a8e1175bSopenharmony_ci            ALLOC(sha512);
477a8e1175bSopenharmony_ci            break;
478a8e1175bSopenharmony_ci#endif
479a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA512_C)
480a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA512:
481a8e1175bSopenharmony_ci            ALLOC(sha512);
482a8e1175bSopenharmony_ci            break;
483a8e1175bSopenharmony_ci#endif
484a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA3_C)
485a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_224:
486a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_256:
487a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_384:
488a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_512:
489a8e1175bSopenharmony_ci            ALLOC(sha3);
490a8e1175bSopenharmony_ci            break;
491a8e1175bSopenharmony_ci#endif
492a8e1175bSopenharmony_ci        default:
493a8e1175bSopenharmony_ci            return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
494a8e1175bSopenharmony_ci    }
495a8e1175bSopenharmony_ci
496a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_C)
497a8e1175bSopenharmony_ci    if (hmac != 0) {
498a8e1175bSopenharmony_ci        ctx->hmac_ctx = mbedtls_calloc(2, md_info->block_size);
499a8e1175bSopenharmony_ci        if (ctx->hmac_ctx == NULL) {
500a8e1175bSopenharmony_ci            mbedtls_md_free(ctx);
501a8e1175bSopenharmony_ci            return MBEDTLS_ERR_MD_ALLOC_FAILED;
502a8e1175bSopenharmony_ci        }
503a8e1175bSopenharmony_ci    }
504a8e1175bSopenharmony_ci#endif
505a8e1175bSopenharmony_ci
506a8e1175bSopenharmony_ci    return 0;
507a8e1175bSopenharmony_ci}
508a8e1175bSopenharmony_ci#undef ALLOC
509a8e1175bSopenharmony_ci
510a8e1175bSopenharmony_ciint mbedtls_md_starts(mbedtls_md_context_t *ctx)
511a8e1175bSopenharmony_ci{
512a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_C)
513a8e1175bSopenharmony_ci    if (ctx == NULL || ctx->md_info == NULL) {
514a8e1175bSopenharmony_ci        return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
515a8e1175bSopenharmony_ci    }
516a8e1175bSopenharmony_ci#endif
517a8e1175bSopenharmony_ci
518a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_SOME_PSA)
519a8e1175bSopenharmony_ci    if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
520a8e1175bSopenharmony_ci        psa_algorithm_t alg = psa_alg_of_md(ctx->md_info);
521a8e1175bSopenharmony_ci        psa_hash_abort(ctx->md_ctx);
522a8e1175bSopenharmony_ci        psa_status_t status = psa_hash_setup(ctx->md_ctx, alg);
523a8e1175bSopenharmony_ci        return mbedtls_md_error_from_psa(status);
524a8e1175bSopenharmony_ci    }
525a8e1175bSopenharmony_ci#endif
526a8e1175bSopenharmony_ci
527a8e1175bSopenharmony_ci    switch (ctx->md_info->type) {
528a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD5_C)
529a8e1175bSopenharmony_ci        case MBEDTLS_MD_MD5:
530a8e1175bSopenharmony_ci            return mbedtls_md5_starts(ctx->md_ctx);
531a8e1175bSopenharmony_ci#endif
532a8e1175bSopenharmony_ci#if defined(MBEDTLS_RIPEMD160_C)
533a8e1175bSopenharmony_ci        case MBEDTLS_MD_RIPEMD160:
534a8e1175bSopenharmony_ci            return mbedtls_ripemd160_starts(ctx->md_ctx);
535a8e1175bSopenharmony_ci#endif
536a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA1_C)
537a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA1:
538a8e1175bSopenharmony_ci            return mbedtls_sha1_starts(ctx->md_ctx);
539a8e1175bSopenharmony_ci#endif
540a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA224_C)
541a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA224:
542a8e1175bSopenharmony_ci            return mbedtls_sha256_starts(ctx->md_ctx, 1);
543a8e1175bSopenharmony_ci#endif
544a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA256_C)
545a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA256:
546a8e1175bSopenharmony_ci            return mbedtls_sha256_starts(ctx->md_ctx, 0);
547a8e1175bSopenharmony_ci#endif
548a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA384_C)
549a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA384:
550a8e1175bSopenharmony_ci            return mbedtls_sha512_starts(ctx->md_ctx, 1);
551a8e1175bSopenharmony_ci#endif
552a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA512_C)
553a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA512:
554a8e1175bSopenharmony_ci            return mbedtls_sha512_starts(ctx->md_ctx, 0);
555a8e1175bSopenharmony_ci#endif
556a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA3_C)
557a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_224:
558a8e1175bSopenharmony_ci            return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_224);
559a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_256:
560a8e1175bSopenharmony_ci            return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_256);
561a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_384:
562a8e1175bSopenharmony_ci            return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_384);
563a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_512:
564a8e1175bSopenharmony_ci            return mbedtls_sha3_starts(ctx->md_ctx, MBEDTLS_SHA3_512);
565a8e1175bSopenharmony_ci#endif
566a8e1175bSopenharmony_ci        default:
567a8e1175bSopenharmony_ci            return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
568a8e1175bSopenharmony_ci    }
569a8e1175bSopenharmony_ci}
570a8e1175bSopenharmony_ci
571a8e1175bSopenharmony_ciint mbedtls_md_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen)
572a8e1175bSopenharmony_ci{
573a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_C)
574a8e1175bSopenharmony_ci    if (ctx == NULL || ctx->md_info == NULL) {
575a8e1175bSopenharmony_ci        return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
576a8e1175bSopenharmony_ci    }
577a8e1175bSopenharmony_ci#endif
578a8e1175bSopenharmony_ci
579a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_SOME_PSA)
580a8e1175bSopenharmony_ci    if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
581a8e1175bSopenharmony_ci        psa_status_t status = psa_hash_update(ctx->md_ctx, input, ilen);
582a8e1175bSopenharmony_ci        return mbedtls_md_error_from_psa(status);
583a8e1175bSopenharmony_ci    }
584a8e1175bSopenharmony_ci#endif
585a8e1175bSopenharmony_ci
586a8e1175bSopenharmony_ci    switch (ctx->md_info->type) {
587a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD5_C)
588a8e1175bSopenharmony_ci        case MBEDTLS_MD_MD5:
589a8e1175bSopenharmony_ci            return mbedtls_md5_update(ctx->md_ctx, input, ilen);
590a8e1175bSopenharmony_ci#endif
591a8e1175bSopenharmony_ci#if defined(MBEDTLS_RIPEMD160_C)
592a8e1175bSopenharmony_ci        case MBEDTLS_MD_RIPEMD160:
593a8e1175bSopenharmony_ci            return mbedtls_ripemd160_update(ctx->md_ctx, input, ilen);
594a8e1175bSopenharmony_ci#endif
595a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA1_C)
596a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA1:
597a8e1175bSopenharmony_ci            return mbedtls_sha1_update(ctx->md_ctx, input, ilen);
598a8e1175bSopenharmony_ci#endif
599a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA224_C)
600a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA224:
601a8e1175bSopenharmony_ci            return mbedtls_sha256_update(ctx->md_ctx, input, ilen);
602a8e1175bSopenharmony_ci#endif
603a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA256_C)
604a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA256:
605a8e1175bSopenharmony_ci            return mbedtls_sha256_update(ctx->md_ctx, input, ilen);
606a8e1175bSopenharmony_ci#endif
607a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA384_C)
608a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA384:
609a8e1175bSopenharmony_ci            return mbedtls_sha512_update(ctx->md_ctx, input, ilen);
610a8e1175bSopenharmony_ci#endif
611a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA512_C)
612a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA512:
613a8e1175bSopenharmony_ci            return mbedtls_sha512_update(ctx->md_ctx, input, ilen);
614a8e1175bSopenharmony_ci#endif
615a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA3_C)
616a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_224:
617a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_256:
618a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_384:
619a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_512:
620a8e1175bSopenharmony_ci            return mbedtls_sha3_update(ctx->md_ctx, input, ilen);
621a8e1175bSopenharmony_ci#endif
622a8e1175bSopenharmony_ci        default:
623a8e1175bSopenharmony_ci            return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
624a8e1175bSopenharmony_ci    }
625a8e1175bSopenharmony_ci}
626a8e1175bSopenharmony_ci
627a8e1175bSopenharmony_ciint mbedtls_md_finish(mbedtls_md_context_t *ctx, unsigned char *output)
628a8e1175bSopenharmony_ci{
629a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_C)
630a8e1175bSopenharmony_ci    if (ctx == NULL || ctx->md_info == NULL) {
631a8e1175bSopenharmony_ci        return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
632a8e1175bSopenharmony_ci    }
633a8e1175bSopenharmony_ci#endif
634a8e1175bSopenharmony_ci
635a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_SOME_PSA)
636a8e1175bSopenharmony_ci    if (ctx->engine == MBEDTLS_MD_ENGINE_PSA) {
637a8e1175bSopenharmony_ci        size_t size = ctx->md_info->size;
638a8e1175bSopenharmony_ci        psa_status_t status = psa_hash_finish(ctx->md_ctx,
639a8e1175bSopenharmony_ci                                              output, size, &size);
640a8e1175bSopenharmony_ci        return mbedtls_md_error_from_psa(status);
641a8e1175bSopenharmony_ci    }
642a8e1175bSopenharmony_ci#endif
643a8e1175bSopenharmony_ci
644a8e1175bSopenharmony_ci    switch (ctx->md_info->type) {
645a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD5_C)
646a8e1175bSopenharmony_ci        case MBEDTLS_MD_MD5:
647a8e1175bSopenharmony_ci            return mbedtls_md5_finish(ctx->md_ctx, output);
648a8e1175bSopenharmony_ci#endif
649a8e1175bSopenharmony_ci#if defined(MBEDTLS_RIPEMD160_C)
650a8e1175bSopenharmony_ci        case MBEDTLS_MD_RIPEMD160:
651a8e1175bSopenharmony_ci            return mbedtls_ripemd160_finish(ctx->md_ctx, output);
652a8e1175bSopenharmony_ci#endif
653a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA1_C)
654a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA1:
655a8e1175bSopenharmony_ci            return mbedtls_sha1_finish(ctx->md_ctx, output);
656a8e1175bSopenharmony_ci#endif
657a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA224_C)
658a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA224:
659a8e1175bSopenharmony_ci            return mbedtls_sha256_finish(ctx->md_ctx, output);
660a8e1175bSopenharmony_ci#endif
661a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA256_C)
662a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA256:
663a8e1175bSopenharmony_ci            return mbedtls_sha256_finish(ctx->md_ctx, output);
664a8e1175bSopenharmony_ci#endif
665a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA384_C)
666a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA384:
667a8e1175bSopenharmony_ci            return mbedtls_sha512_finish(ctx->md_ctx, output);
668a8e1175bSopenharmony_ci#endif
669a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA512_C)
670a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA512:
671a8e1175bSopenharmony_ci            return mbedtls_sha512_finish(ctx->md_ctx, output);
672a8e1175bSopenharmony_ci#endif
673a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA3_C)
674a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_224:
675a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_256:
676a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_384:
677a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_512:
678a8e1175bSopenharmony_ci            return mbedtls_sha3_finish(ctx->md_ctx, output, ctx->md_info->size);
679a8e1175bSopenharmony_ci#endif
680a8e1175bSopenharmony_ci        default:
681a8e1175bSopenharmony_ci            return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
682a8e1175bSopenharmony_ci    }
683a8e1175bSopenharmony_ci}
684a8e1175bSopenharmony_ci
685a8e1175bSopenharmony_ciint mbedtls_md(const mbedtls_md_info_t *md_info, const unsigned char *input, size_t ilen,
686a8e1175bSopenharmony_ci               unsigned char *output)
687a8e1175bSopenharmony_ci{
688a8e1175bSopenharmony_ci    if (md_info == NULL) {
689a8e1175bSopenharmony_ci        return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
690a8e1175bSopenharmony_ci    }
691a8e1175bSopenharmony_ci
692a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_SOME_PSA)
693a8e1175bSopenharmony_ci    if (md_can_use_psa(md_info)) {
694a8e1175bSopenharmony_ci        size_t size = md_info->size;
695a8e1175bSopenharmony_ci        psa_status_t status = psa_hash_compute(psa_alg_of_md(md_info),
696a8e1175bSopenharmony_ci                                               input, ilen,
697a8e1175bSopenharmony_ci                                               output, size, &size);
698a8e1175bSopenharmony_ci        return mbedtls_md_error_from_psa(status);
699a8e1175bSopenharmony_ci    }
700a8e1175bSopenharmony_ci#endif
701a8e1175bSopenharmony_ci
702a8e1175bSopenharmony_ci    switch (md_info->type) {
703a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD5_C)
704a8e1175bSopenharmony_ci        case MBEDTLS_MD_MD5:
705a8e1175bSopenharmony_ci            return mbedtls_md5(input, ilen, output);
706a8e1175bSopenharmony_ci#endif
707a8e1175bSopenharmony_ci#if defined(MBEDTLS_RIPEMD160_C)
708a8e1175bSopenharmony_ci        case MBEDTLS_MD_RIPEMD160:
709a8e1175bSopenharmony_ci            return mbedtls_ripemd160(input, ilen, output);
710a8e1175bSopenharmony_ci#endif
711a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA1_C)
712a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA1:
713a8e1175bSopenharmony_ci            return mbedtls_sha1(input, ilen, output);
714a8e1175bSopenharmony_ci#endif
715a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA224_C)
716a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA224:
717a8e1175bSopenharmony_ci            return mbedtls_sha256(input, ilen, output, 1);
718a8e1175bSopenharmony_ci#endif
719a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA256_C)
720a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA256:
721a8e1175bSopenharmony_ci            return mbedtls_sha256(input, ilen, output, 0);
722a8e1175bSopenharmony_ci#endif
723a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA384_C)
724a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA384:
725a8e1175bSopenharmony_ci            return mbedtls_sha512(input, ilen, output, 1);
726a8e1175bSopenharmony_ci#endif
727a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA512_C)
728a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA512:
729a8e1175bSopenharmony_ci            return mbedtls_sha512(input, ilen, output, 0);
730a8e1175bSopenharmony_ci#endif
731a8e1175bSopenharmony_ci#if defined(MBEDTLS_SHA3_C)
732a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_224:
733a8e1175bSopenharmony_ci            return mbedtls_sha3(MBEDTLS_SHA3_224, input, ilen, output, md_info->size);
734a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_256:
735a8e1175bSopenharmony_ci            return mbedtls_sha3(MBEDTLS_SHA3_256, input, ilen, output, md_info->size);
736a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_384:
737a8e1175bSopenharmony_ci            return mbedtls_sha3(MBEDTLS_SHA3_384, input, ilen, output, md_info->size);
738a8e1175bSopenharmony_ci        case MBEDTLS_MD_SHA3_512:
739a8e1175bSopenharmony_ci            return mbedtls_sha3(MBEDTLS_SHA3_512, input, ilen, output, md_info->size);
740a8e1175bSopenharmony_ci#endif
741a8e1175bSopenharmony_ci        default:
742a8e1175bSopenharmony_ci            return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
743a8e1175bSopenharmony_ci    }
744a8e1175bSopenharmony_ci}
745a8e1175bSopenharmony_ci
746a8e1175bSopenharmony_ciunsigned char mbedtls_md_get_size(const mbedtls_md_info_t *md_info)
747a8e1175bSopenharmony_ci{
748a8e1175bSopenharmony_ci    if (md_info == NULL) {
749a8e1175bSopenharmony_ci        return 0;
750a8e1175bSopenharmony_ci    }
751a8e1175bSopenharmony_ci
752a8e1175bSopenharmony_ci    return md_info->size;
753a8e1175bSopenharmony_ci}
754a8e1175bSopenharmony_ci
755a8e1175bSopenharmony_cimbedtls_md_type_t mbedtls_md_get_type(const mbedtls_md_info_t *md_info)
756a8e1175bSopenharmony_ci{
757a8e1175bSopenharmony_ci    if (md_info == NULL) {
758a8e1175bSopenharmony_ci        return MBEDTLS_MD_NONE;
759a8e1175bSopenharmony_ci    }
760a8e1175bSopenharmony_ci
761a8e1175bSopenharmony_ci    return md_info->type;
762a8e1175bSopenharmony_ci}
763a8e1175bSopenharmony_ci
764a8e1175bSopenharmony_ci#if defined(MBEDTLS_PSA_CRYPTO_C)
765a8e1175bSopenharmony_ciint mbedtls_md_error_from_psa(psa_status_t status)
766a8e1175bSopenharmony_ci{
767a8e1175bSopenharmony_ci    return PSA_TO_MBEDTLS_ERR_LIST(status, psa_to_md_errors,
768a8e1175bSopenharmony_ci                                   psa_generic_status_to_mbedtls);
769a8e1175bSopenharmony_ci}
770a8e1175bSopenharmony_ci#endif /* MBEDTLS_PSA_CRYPTO_C */
771a8e1175bSopenharmony_ci
772a8e1175bSopenharmony_ci
773a8e1175bSopenharmony_ci/************************************************************************
774a8e1175bSopenharmony_ci * Functions above this separator are part of MBEDTLS_MD_LIGHT,         *
775a8e1175bSopenharmony_ci * functions below are only available when MBEDTLS_MD_C is set.         *
776a8e1175bSopenharmony_ci ************************************************************************/
777a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_C)
778a8e1175bSopenharmony_ci
779a8e1175bSopenharmony_ci/*
780a8e1175bSopenharmony_ci * Reminder: update profiles in x509_crt.c when adding a new hash!
781a8e1175bSopenharmony_ci */
782a8e1175bSopenharmony_cistatic const int supported_digests[] = {
783a8e1175bSopenharmony_ci
784a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA512)
785a8e1175bSopenharmony_ci    MBEDTLS_MD_SHA512,
786a8e1175bSopenharmony_ci#endif
787a8e1175bSopenharmony_ci
788a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA384)
789a8e1175bSopenharmony_ci    MBEDTLS_MD_SHA384,
790a8e1175bSopenharmony_ci#endif
791a8e1175bSopenharmony_ci
792a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA256)
793a8e1175bSopenharmony_ci    MBEDTLS_MD_SHA256,
794a8e1175bSopenharmony_ci#endif
795a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA224)
796a8e1175bSopenharmony_ci    MBEDTLS_MD_SHA224,
797a8e1175bSopenharmony_ci#endif
798a8e1175bSopenharmony_ci
799a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA1)
800a8e1175bSopenharmony_ci    MBEDTLS_MD_SHA1,
801a8e1175bSopenharmony_ci#endif
802a8e1175bSopenharmony_ci
803a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_RIPEMD160)
804a8e1175bSopenharmony_ci    MBEDTLS_MD_RIPEMD160,
805a8e1175bSopenharmony_ci#endif
806a8e1175bSopenharmony_ci
807a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_MD5)
808a8e1175bSopenharmony_ci    MBEDTLS_MD_MD5,
809a8e1175bSopenharmony_ci#endif
810a8e1175bSopenharmony_ci
811a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA3_224)
812a8e1175bSopenharmony_ci    MBEDTLS_MD_SHA3_224,
813a8e1175bSopenharmony_ci#endif
814a8e1175bSopenharmony_ci
815a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA3_256)
816a8e1175bSopenharmony_ci    MBEDTLS_MD_SHA3_256,
817a8e1175bSopenharmony_ci#endif
818a8e1175bSopenharmony_ci
819a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA3_384)
820a8e1175bSopenharmony_ci    MBEDTLS_MD_SHA3_384,
821a8e1175bSopenharmony_ci#endif
822a8e1175bSopenharmony_ci
823a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA3_512)
824a8e1175bSopenharmony_ci    MBEDTLS_MD_SHA3_512,
825a8e1175bSopenharmony_ci#endif
826a8e1175bSopenharmony_ci
827a8e1175bSopenharmony_ci    MBEDTLS_MD_NONE
828a8e1175bSopenharmony_ci};
829a8e1175bSopenharmony_ci
830a8e1175bSopenharmony_ciconst int *mbedtls_md_list(void)
831a8e1175bSopenharmony_ci{
832a8e1175bSopenharmony_ci    return supported_digests;
833a8e1175bSopenharmony_ci}
834a8e1175bSopenharmony_ci
835a8e1175bSopenharmony_citypedef struct {
836a8e1175bSopenharmony_ci    const char *md_name;
837a8e1175bSopenharmony_ci    mbedtls_md_type_t md_type;
838a8e1175bSopenharmony_ci} md_name_entry;
839a8e1175bSopenharmony_ci
840a8e1175bSopenharmony_cistatic const md_name_entry md_names[] = {
841a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_MD5)
842a8e1175bSopenharmony_ci    { "MD5", MBEDTLS_MD_MD5 },
843a8e1175bSopenharmony_ci#endif
844a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_RIPEMD160)
845a8e1175bSopenharmony_ci    { "RIPEMD160", MBEDTLS_MD_RIPEMD160 },
846a8e1175bSopenharmony_ci#endif
847a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA1)
848a8e1175bSopenharmony_ci    { "SHA1", MBEDTLS_MD_SHA1 },
849a8e1175bSopenharmony_ci    { "SHA", MBEDTLS_MD_SHA1 }, // compatibility fallback
850a8e1175bSopenharmony_ci#endif
851a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA224)
852a8e1175bSopenharmony_ci    { "SHA224", MBEDTLS_MD_SHA224 },
853a8e1175bSopenharmony_ci#endif
854a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA256)
855a8e1175bSopenharmony_ci    { "SHA256", MBEDTLS_MD_SHA256 },
856a8e1175bSopenharmony_ci#endif
857a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA384)
858a8e1175bSopenharmony_ci    { "SHA384", MBEDTLS_MD_SHA384 },
859a8e1175bSopenharmony_ci#endif
860a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA512)
861a8e1175bSopenharmony_ci    { "SHA512", MBEDTLS_MD_SHA512 },
862a8e1175bSopenharmony_ci#endif
863a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA3_224)
864a8e1175bSopenharmony_ci    { "SHA3-224", MBEDTLS_MD_SHA3_224 },
865a8e1175bSopenharmony_ci#endif
866a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA3_256)
867a8e1175bSopenharmony_ci    { "SHA3-256", MBEDTLS_MD_SHA3_256 },
868a8e1175bSopenharmony_ci#endif
869a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA3_384)
870a8e1175bSopenharmony_ci    { "SHA3-384", MBEDTLS_MD_SHA3_384 },
871a8e1175bSopenharmony_ci#endif
872a8e1175bSopenharmony_ci#if defined(MBEDTLS_MD_CAN_SHA3_512)
873a8e1175bSopenharmony_ci    { "SHA3-512", MBEDTLS_MD_SHA3_512 },
874a8e1175bSopenharmony_ci#endif
875a8e1175bSopenharmony_ci    { NULL, MBEDTLS_MD_NONE },
876a8e1175bSopenharmony_ci};
877a8e1175bSopenharmony_ci
878a8e1175bSopenharmony_ciconst mbedtls_md_info_t *mbedtls_md_info_from_string(const char *md_name)
879a8e1175bSopenharmony_ci{
880a8e1175bSopenharmony_ci    if (NULL == md_name) {
881a8e1175bSopenharmony_ci        return NULL;
882a8e1175bSopenharmony_ci    }
883a8e1175bSopenharmony_ci
884a8e1175bSopenharmony_ci    const md_name_entry *entry = md_names;
885a8e1175bSopenharmony_ci    while (entry->md_name != NULL &&
886a8e1175bSopenharmony_ci           strcmp(entry->md_name, md_name) != 0) {
887a8e1175bSopenharmony_ci        ++entry;
888a8e1175bSopenharmony_ci    }
889a8e1175bSopenharmony_ci
890a8e1175bSopenharmony_ci    return mbedtls_md_info_from_type(entry->md_type);
891a8e1175bSopenharmony_ci}
892a8e1175bSopenharmony_ci
893a8e1175bSopenharmony_ciconst char *mbedtls_md_get_name(const mbedtls_md_info_t *md_info)
894a8e1175bSopenharmony_ci{
895a8e1175bSopenharmony_ci    if (md_info == NULL) {
896a8e1175bSopenharmony_ci        return NULL;
897a8e1175bSopenharmony_ci    }
898a8e1175bSopenharmony_ci
899a8e1175bSopenharmony_ci    const md_name_entry *entry = md_names;
900a8e1175bSopenharmony_ci    while (entry->md_type != MBEDTLS_MD_NONE &&
901a8e1175bSopenharmony_ci           entry->md_type != md_info->type) {
902a8e1175bSopenharmony_ci        ++entry;
903a8e1175bSopenharmony_ci    }
904a8e1175bSopenharmony_ci
905a8e1175bSopenharmony_ci    return entry->md_name;
906a8e1175bSopenharmony_ci}
907a8e1175bSopenharmony_ci
908a8e1175bSopenharmony_ciconst mbedtls_md_info_t *mbedtls_md_info_from_ctx(
909a8e1175bSopenharmony_ci    const mbedtls_md_context_t *ctx)
910a8e1175bSopenharmony_ci{
911a8e1175bSopenharmony_ci    if (ctx == NULL) {
912a8e1175bSopenharmony_ci        return NULL;
913a8e1175bSopenharmony_ci    }
914a8e1175bSopenharmony_ci
915a8e1175bSopenharmony_ci    return ctx->MBEDTLS_PRIVATE(md_info);
916a8e1175bSopenharmony_ci}
917a8e1175bSopenharmony_ci
918a8e1175bSopenharmony_ci#if defined(MBEDTLS_FS_IO)
919a8e1175bSopenharmony_ciint mbedtls_md_file(const mbedtls_md_info_t *md_info, const char *path, unsigned char *output)
920a8e1175bSopenharmony_ci{
921a8e1175bSopenharmony_ci    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
922a8e1175bSopenharmony_ci    FILE *f;
923a8e1175bSopenharmony_ci    size_t n;
924a8e1175bSopenharmony_ci    mbedtls_md_context_t ctx;
925a8e1175bSopenharmony_ci    unsigned char buf[1024];
926a8e1175bSopenharmony_ci
927a8e1175bSopenharmony_ci    if (md_info == NULL) {
928a8e1175bSopenharmony_ci        return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
929a8e1175bSopenharmony_ci    }
930a8e1175bSopenharmony_ci
931a8e1175bSopenharmony_ci    if ((f = fopen(path, "rb")) == NULL) {
932a8e1175bSopenharmony_ci        return MBEDTLS_ERR_MD_FILE_IO_ERROR;
933a8e1175bSopenharmony_ci    }
934a8e1175bSopenharmony_ci
935a8e1175bSopenharmony_ci    /* Ensure no stdio buffering of secrets, as such buffers cannot be wiped. */
936a8e1175bSopenharmony_ci    mbedtls_setbuf(f, NULL);
937a8e1175bSopenharmony_ci
938a8e1175bSopenharmony_ci    mbedtls_md_init(&ctx);
939a8e1175bSopenharmony_ci
940a8e1175bSopenharmony_ci    if ((ret = mbedtls_md_setup(&ctx, md_info, 0)) != 0) {
941a8e1175bSopenharmony_ci        goto cleanup;
942a8e1175bSopenharmony_ci    }
943a8e1175bSopenharmony_ci
944a8e1175bSopenharmony_ci    if ((ret = mbedtls_md_starts(&ctx)) != 0) {
945a8e1175bSopenharmony_ci        goto cleanup;
946a8e1175bSopenharmony_ci    }
947a8e1175bSopenharmony_ci
948a8e1175bSopenharmony_ci    while ((n = fread(buf, 1, sizeof(buf), f)) > 0) {
949a8e1175bSopenharmony_ci        if ((ret = mbedtls_md_update(&ctx, buf, n)) != 0) {
950a8e1175bSopenharmony_ci            goto cleanup;
951a8e1175bSopenharmony_ci        }
952a8e1175bSopenharmony_ci    }
953a8e1175bSopenharmony_ci
954a8e1175bSopenharmony_ci    if (ferror(f) != 0) {
955a8e1175bSopenharmony_ci        ret = MBEDTLS_ERR_MD_FILE_IO_ERROR;
956a8e1175bSopenharmony_ci    } else {
957a8e1175bSopenharmony_ci        ret = mbedtls_md_finish(&ctx, output);
958a8e1175bSopenharmony_ci    }
959a8e1175bSopenharmony_ci
960a8e1175bSopenharmony_cicleanup:
961a8e1175bSopenharmony_ci    mbedtls_platform_zeroize(buf, sizeof(buf));
962a8e1175bSopenharmony_ci    fclose(f);
963a8e1175bSopenharmony_ci    mbedtls_md_free(&ctx);
964a8e1175bSopenharmony_ci
965a8e1175bSopenharmony_ci    return ret;
966a8e1175bSopenharmony_ci}
967a8e1175bSopenharmony_ci#endif /* MBEDTLS_FS_IO */
968a8e1175bSopenharmony_ci
969a8e1175bSopenharmony_ciint mbedtls_md_hmac_starts(mbedtls_md_context_t *ctx, const unsigned char *key, size_t keylen)
970a8e1175bSopenharmony_ci{
971a8e1175bSopenharmony_ci    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
972a8e1175bSopenharmony_ci    unsigned char sum[MBEDTLS_MD_MAX_SIZE];
973a8e1175bSopenharmony_ci    unsigned char *ipad, *opad;
974a8e1175bSopenharmony_ci
975a8e1175bSopenharmony_ci    if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
976a8e1175bSopenharmony_ci        return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
977a8e1175bSopenharmony_ci    }
978a8e1175bSopenharmony_ci
979a8e1175bSopenharmony_ci    if (keylen > (size_t) ctx->md_info->block_size) {
980a8e1175bSopenharmony_ci        if ((ret = mbedtls_md_starts(ctx)) != 0) {
981a8e1175bSopenharmony_ci            goto cleanup;
982a8e1175bSopenharmony_ci        }
983a8e1175bSopenharmony_ci        if ((ret = mbedtls_md_update(ctx, key, keylen)) != 0) {
984a8e1175bSopenharmony_ci            goto cleanup;
985a8e1175bSopenharmony_ci        }
986a8e1175bSopenharmony_ci        if ((ret = mbedtls_md_finish(ctx, sum)) != 0) {
987a8e1175bSopenharmony_ci            goto cleanup;
988a8e1175bSopenharmony_ci        }
989a8e1175bSopenharmony_ci
990a8e1175bSopenharmony_ci        keylen = ctx->md_info->size;
991a8e1175bSopenharmony_ci        key = sum;
992a8e1175bSopenharmony_ci    }
993a8e1175bSopenharmony_ci
994a8e1175bSopenharmony_ci    ipad = (unsigned char *) ctx->hmac_ctx;
995a8e1175bSopenharmony_ci    opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
996a8e1175bSopenharmony_ci
997a8e1175bSopenharmony_ci    memset(ipad, 0x36, ctx->md_info->block_size);
998a8e1175bSopenharmony_ci    memset(opad, 0x5C, ctx->md_info->block_size);
999a8e1175bSopenharmony_ci
1000a8e1175bSopenharmony_ci    mbedtls_xor(ipad, ipad, key, keylen);
1001a8e1175bSopenharmony_ci    mbedtls_xor(opad, opad, key, keylen);
1002a8e1175bSopenharmony_ci
1003a8e1175bSopenharmony_ci    if ((ret = mbedtls_md_starts(ctx)) != 0) {
1004a8e1175bSopenharmony_ci        goto cleanup;
1005a8e1175bSopenharmony_ci    }
1006a8e1175bSopenharmony_ci    if ((ret = mbedtls_md_update(ctx, ipad,
1007a8e1175bSopenharmony_ci                                 ctx->md_info->block_size)) != 0) {
1008a8e1175bSopenharmony_ci        goto cleanup;
1009a8e1175bSopenharmony_ci    }
1010a8e1175bSopenharmony_ci
1011a8e1175bSopenharmony_cicleanup:
1012a8e1175bSopenharmony_ci    mbedtls_platform_zeroize(sum, sizeof(sum));
1013a8e1175bSopenharmony_ci
1014a8e1175bSopenharmony_ci    return ret;
1015a8e1175bSopenharmony_ci}
1016a8e1175bSopenharmony_ci
1017a8e1175bSopenharmony_ciint mbedtls_md_hmac_update(mbedtls_md_context_t *ctx, const unsigned char *input, size_t ilen)
1018a8e1175bSopenharmony_ci{
1019a8e1175bSopenharmony_ci    if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
1020a8e1175bSopenharmony_ci        return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
1021a8e1175bSopenharmony_ci    }
1022a8e1175bSopenharmony_ci
1023a8e1175bSopenharmony_ci    return mbedtls_md_update(ctx, input, ilen);
1024a8e1175bSopenharmony_ci}
1025a8e1175bSopenharmony_ci
1026a8e1175bSopenharmony_ciint mbedtls_md_hmac_finish(mbedtls_md_context_t *ctx, unsigned char *output)
1027a8e1175bSopenharmony_ci{
1028a8e1175bSopenharmony_ci    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1029a8e1175bSopenharmony_ci    unsigned char tmp[MBEDTLS_MD_MAX_SIZE];
1030a8e1175bSopenharmony_ci    unsigned char *opad;
1031a8e1175bSopenharmony_ci
1032a8e1175bSopenharmony_ci    if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
1033a8e1175bSopenharmony_ci        return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
1034a8e1175bSopenharmony_ci    }
1035a8e1175bSopenharmony_ci
1036a8e1175bSopenharmony_ci    opad = (unsigned char *) ctx->hmac_ctx + ctx->md_info->block_size;
1037a8e1175bSopenharmony_ci
1038a8e1175bSopenharmony_ci    if ((ret = mbedtls_md_finish(ctx, tmp)) != 0) {
1039a8e1175bSopenharmony_ci        return ret;
1040a8e1175bSopenharmony_ci    }
1041a8e1175bSopenharmony_ci    if ((ret = mbedtls_md_starts(ctx)) != 0) {
1042a8e1175bSopenharmony_ci        return ret;
1043a8e1175bSopenharmony_ci    }
1044a8e1175bSopenharmony_ci    if ((ret = mbedtls_md_update(ctx, opad,
1045a8e1175bSopenharmony_ci                                 ctx->md_info->block_size)) != 0) {
1046a8e1175bSopenharmony_ci        return ret;
1047a8e1175bSopenharmony_ci    }
1048a8e1175bSopenharmony_ci    if ((ret = mbedtls_md_update(ctx, tmp,
1049a8e1175bSopenharmony_ci                                 ctx->md_info->size)) != 0) {
1050a8e1175bSopenharmony_ci        return ret;
1051a8e1175bSopenharmony_ci    }
1052a8e1175bSopenharmony_ci    return mbedtls_md_finish(ctx, output);
1053a8e1175bSopenharmony_ci}
1054a8e1175bSopenharmony_ci
1055a8e1175bSopenharmony_ciint mbedtls_md_hmac_reset(mbedtls_md_context_t *ctx)
1056a8e1175bSopenharmony_ci{
1057a8e1175bSopenharmony_ci    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1058a8e1175bSopenharmony_ci    unsigned char *ipad;
1059a8e1175bSopenharmony_ci
1060a8e1175bSopenharmony_ci    if (ctx == NULL || ctx->md_info == NULL || ctx->hmac_ctx == NULL) {
1061a8e1175bSopenharmony_ci        return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
1062a8e1175bSopenharmony_ci    }
1063a8e1175bSopenharmony_ci
1064a8e1175bSopenharmony_ci    ipad = (unsigned char *) ctx->hmac_ctx;
1065a8e1175bSopenharmony_ci
1066a8e1175bSopenharmony_ci    if ((ret = mbedtls_md_starts(ctx)) != 0) {
1067a8e1175bSopenharmony_ci        return ret;
1068a8e1175bSopenharmony_ci    }
1069a8e1175bSopenharmony_ci    return mbedtls_md_update(ctx, ipad, ctx->md_info->block_size);
1070a8e1175bSopenharmony_ci}
1071a8e1175bSopenharmony_ci
1072a8e1175bSopenharmony_ciint mbedtls_md_hmac(const mbedtls_md_info_t *md_info,
1073a8e1175bSopenharmony_ci                    const unsigned char *key, size_t keylen,
1074a8e1175bSopenharmony_ci                    const unsigned char *input, size_t ilen,
1075a8e1175bSopenharmony_ci                    unsigned char *output)
1076a8e1175bSopenharmony_ci{
1077a8e1175bSopenharmony_ci    mbedtls_md_context_t ctx;
1078a8e1175bSopenharmony_ci    int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
1079a8e1175bSopenharmony_ci
1080a8e1175bSopenharmony_ci    if (md_info == NULL) {
1081a8e1175bSopenharmony_ci        return MBEDTLS_ERR_MD_BAD_INPUT_DATA;
1082a8e1175bSopenharmony_ci    }
1083a8e1175bSopenharmony_ci
1084a8e1175bSopenharmony_ci    mbedtls_md_init(&ctx);
1085a8e1175bSopenharmony_ci
1086a8e1175bSopenharmony_ci    if ((ret = mbedtls_md_setup(&ctx, md_info, 1)) != 0) {
1087a8e1175bSopenharmony_ci        goto cleanup;
1088a8e1175bSopenharmony_ci    }
1089a8e1175bSopenharmony_ci
1090a8e1175bSopenharmony_ci    if ((ret = mbedtls_md_hmac_starts(&ctx, key, keylen)) != 0) {
1091a8e1175bSopenharmony_ci        goto cleanup;
1092a8e1175bSopenharmony_ci    }
1093a8e1175bSopenharmony_ci    if ((ret = mbedtls_md_hmac_update(&ctx, input, ilen)) != 0) {
1094a8e1175bSopenharmony_ci        goto cleanup;
1095a8e1175bSopenharmony_ci    }
1096a8e1175bSopenharmony_ci    if ((ret = mbedtls_md_hmac_finish(&ctx, output)) != 0) {
1097a8e1175bSopenharmony_ci        goto cleanup;
1098a8e1175bSopenharmony_ci    }
1099a8e1175bSopenharmony_ci
1100a8e1175bSopenharmony_cicleanup:
1101a8e1175bSopenharmony_ci    mbedtls_md_free(&ctx);
1102a8e1175bSopenharmony_ci
1103a8e1175bSopenharmony_ci    return ret;
1104a8e1175bSopenharmony_ci}
1105a8e1175bSopenharmony_ci
1106a8e1175bSopenharmony_ci#endif /* MBEDTLS_MD_C */
1107a8e1175bSopenharmony_ci
1108a8e1175bSopenharmony_ci#endif /* MBEDTLS_MD_LIGHT */
1109