1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * Copyright (c) 2013, Andreas Oetken.
4  */
5 
6 #ifndef USE_HOSTCC
7 #include <common.h>
8 #include <fdtdec.h>
9 #include <asm/byteorder.h>
10 #include <linux/errno.h>
11 #include <asm/unaligned.h>
12 #include <hash.h>
13 #else
14 #include "fdt_host.h"
15 #endif
16 #include <hash.h>
17 #include <image.h>
18 
hash_calculate(const char * name,const struct image_region region[],int region_count,uint8_t * checksum)19 int hash_calculate(const char *name,
20 		    const struct image_region region[],
21 		    int region_count, uint8_t *checksum)
22 {
23 	struct hash_algo *algo;
24 	int ret = 0;
25 	void *ctx;
26 	uint32_t i;
27 	i = 0;
28 
29 	ret = hash_progressive_lookup_algo(name, &algo);
30 	if (ret)
31 		return ret;
32 
33 	ret = algo->hash_init(algo, &ctx);
34 	if (ret)
35 		return ret;
36 
37 	for (i = 0; i < region_count - 1; i++) {
38 		ret = algo->hash_update(algo, ctx, region[i].data,
39 					region[i].size, 0);
40 		if (ret)
41 			return ret;
42 	}
43 
44 	ret = algo->hash_update(algo, ctx, region[i].data, region[i].size, 1);
45 	if (ret)
46 		return ret;
47 	ret = algo->hash_finish(algo, ctx, checksum, algo->digest_size);
48 	if (ret)
49 		return ret;
50 
51 	return 0;
52 }
53