1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * FIPS-180-2 compliant SHA-256 implementation
4  *
5  * Copyright (C) 2001-2003  Christophe Devine
6  */
7 
8 #ifndef USE_HOSTCC
9 #include <u-boot/schedule.h>
10 #endif /* USE_HOSTCC */
11 #include <string.h>
12 #include <u-boot/sha256.h>
13 
14 #include <linux/compiler_attributes.h>
15 
16 /*
17  * Output = SHA-256( input buffer ). Trigger the watchdog every 'chunk_sz'
18  * bytes of input processed.
19  */
sha256_csum_wd(const unsigned char * input,unsigned int ilen,unsigned char * output,unsigned int chunk_sz)20 void sha256_csum_wd(const unsigned char *input, unsigned int ilen,
21 		    unsigned char *output, unsigned int chunk_sz)
22 {
23 	sha256_context ctx;
24 #if !defined(USE_HOSTCC) && \
25 	(defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG))
26 	const unsigned char *end;
27 	unsigned char *curr;
28 	int chunk;
29 #endif
30 
31 	sha256_starts(&ctx);
32 
33 #if !defined(USE_HOSTCC) && \
34 	(defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG))
35 	curr = (unsigned char *)input;
36 	end = input + ilen;
37 	while (curr < end) {
38 		chunk = end - curr;
39 		if (chunk > chunk_sz)
40 			chunk = chunk_sz;
41 		sha256_update(&ctx, curr, chunk);
42 		curr += chunk;
43 		schedule();
44 	}
45 #else
46 	sha256_update(&ctx, input, ilen);
47 #endif
48 
49 	sha256_finish(&ctx, output);
50 }
51