1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3 * Hash shim layer on MbedTLS Crypto library
4 *
5 * Copyright (c) 2024 Linaro Limited
6 * Author: Raymond Mao <raymond.mao@linaro.org>
7 */
8 #include "compiler.h"
9
10 #ifndef USE_HOSTCC
11 #include <watchdog.h>
12 #endif /* USE_HOSTCC */
13 #include <u-boot/md5.h>
14
MD5Init(MD5Context * ctx)15 void MD5Init(MD5Context *ctx)
16 {
17 mbedtls_md5_init(ctx);
18 mbedtls_md5_starts(ctx);
19 }
20
MD5Update(MD5Context * ctx,unsigned char const * buf,unsigned int len)21 void MD5Update(MD5Context *ctx, unsigned char const *buf, unsigned int len)
22 {
23 mbedtls_md5_update(ctx, buf, len);
24 }
25
MD5Final(unsigned char digest[16],MD5Context * ctx)26 void MD5Final(unsigned char digest[16], MD5Context *ctx)
27 {
28 mbedtls_md5_finish(ctx, digest);
29 mbedtls_md5_free(ctx);
30 }
31
md5_wd(const unsigned char * input,unsigned int len,unsigned char output[16],unsigned int chunk_sz)32 void md5_wd(const unsigned char *input, unsigned int len,
33 unsigned char output[16], unsigned int chunk_sz)
34 {
35 MD5Context context;
36
37 MD5Init(&context);
38
39 if (IS_ENABLED(CONFIG_HW_WATCHDOG) || IS_ENABLED(CONFIG_WATCHDOG)) {
40 const unsigned char *curr = input;
41 const unsigned char *end = input + len;
42 int chunk;
43
44 while (curr < end) {
45 chunk = end - curr;
46 if (chunk > chunk_sz)
47 chunk = chunk_sz;
48 MD5Update(&context, curr, chunk);
49 curr += chunk;
50 schedule();
51 }
52 } else {
53 MD5Update(&context, input, len);
54 }
55
56 MD5Final(output, &context);
57 }
58