xref: /openbmc/u-boot/lib/rsa/rsa-checksum.c (revision 0649cd0d)
1 /*
2  * Copyright (c) 2013, Andreas Oetken.
3  *
4  * SPDX-License-Identifier:    GPL-2.0+
5  */
6 
7 #ifndef USE_HOSTCC
8 #include <common.h>
9 #include <fdtdec.h>
10 #include <asm/byteorder.h>
11 #include <linux/errno.h>
12 #include <asm/unaligned.h>
13 #include <hash.h>
14 #else
15 #include "fdt_host.h"
16 #endif
17 #include <u-boot/rsa.h>
18 
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