xref: /rk3399_rockchip-uboot/lib/rsa/rsa-checksum.c (revision 82a88d02ff6c95e6e4adb49af7530980e2bc0243)
1646257d1SHeiko Schocher /*
2646257d1SHeiko Schocher  * Copyright (c) 2013, Andreas Oetken.
3646257d1SHeiko Schocher  *
4646257d1SHeiko Schocher  * SPDX-License-Identifier:    GPL-2.0+
5646257d1SHeiko Schocher  */
6646257d1SHeiko Schocher 
729a23f9dSHeiko Schocher #ifndef USE_HOSTCC
8646257d1SHeiko Schocher #include <common.h>
9008ec9b4SJoseph Chen #include <crypto.h>
10646257d1SHeiko Schocher #include <fdtdec.h>
11646257d1SHeiko Schocher #include <asm/byteorder.h>
121221ce45SMasahiro Yamada #include <linux/errno.h>
13646257d1SHeiko Schocher #include <asm/unaligned.h>
14b37b46f0SRuchika Gupta #include <hash.h>
1529a23f9dSHeiko Schocher #else
1629a23f9dSHeiko Schocher #include "fdt_host.h"
17b37b46f0SRuchika Gupta #endif
18b37b46f0SRuchika Gupta #include <u-boot/rsa.h>
19646257d1SHeiko Schocher 
rsa_hash_calculate(const char * name,const struct image_region region[],int region_count,uint8_t * checksum)201a768a29SJoseph Chen int rsa_hash_calculate(const char *name,
21b37b46f0SRuchika Gupta 		       const struct image_region region[],
22b37b46f0SRuchika Gupta 		       int region_count, uint8_t *checksum)
23646257d1SHeiko Schocher {
24b37b46f0SRuchika Gupta 	struct hash_algo *algo;
25b37b46f0SRuchika Gupta 	int ret = 0;
26b37b46f0SRuchika Gupta 	void *ctx;
27646257d1SHeiko Schocher 	uint32_t i;
28646257d1SHeiko Schocher 	i = 0;
29646257d1SHeiko Schocher 
30b37b46f0SRuchika Gupta 	ret = hash_progressive_lookup_algo(name, &algo);
31b37b46f0SRuchika Gupta 	if (ret)
32b37b46f0SRuchika Gupta 		return ret;
33b37b46f0SRuchika Gupta 
34b37b46f0SRuchika Gupta 	ret = algo->hash_init(algo, &ctx);
35b37b46f0SRuchika Gupta 	if (ret)
36b37b46f0SRuchika Gupta 		return ret;
37b37b46f0SRuchika Gupta 
38b37b46f0SRuchika Gupta 	for (i = 0; i < region_count - 1; i++) {
39b37b46f0SRuchika Gupta 		ret = algo->hash_update(algo, ctx, region[i].data,
40b37b46f0SRuchika Gupta 					region[i].size, 0);
41b37b46f0SRuchika Gupta 		if (ret)
42b37b46f0SRuchika Gupta 			return ret;
43646257d1SHeiko Schocher 	}
44646257d1SHeiko Schocher 
45b37b46f0SRuchika Gupta 	ret = algo->hash_update(algo, ctx, region[i].data, region[i].size, 1);
46b37b46f0SRuchika Gupta 	if (ret)
47b37b46f0SRuchika Gupta 		return ret;
48b37b46f0SRuchika Gupta 	ret = algo->hash_finish(algo, ctx, checksum, algo->digest_size);
49b37b46f0SRuchika Gupta 	if (ret)
50b37b46f0SRuchika Gupta 		return ret;
51646257d1SHeiko Schocher 
52b37b46f0SRuchika Gupta 	return 0;
53646257d1SHeiko Schocher }
54008ec9b4SJoseph Chen 
551a768a29SJoseph Chen #if !defined(USE_HOSTCC)
56008ec9b4SJoseph Chen #if CONFIG_IS_ENABLED(FIT_HW_CRYPTO)
hw_rsa_hash_calculate(const char * name,const struct image_region region[],int region_count,uint8_t * checksum)571a768a29SJoseph Chen int hw_rsa_hash_calculate(const char *name,
58008ec9b4SJoseph Chen 			  const struct image_region region[],
59008ec9b4SJoseph Chen 			  int region_count, uint8_t *checksum)
60008ec9b4SJoseph Chen 
61008ec9b4SJoseph Chen {
62008ec9b4SJoseph Chen 	struct udevice *dev;
63008ec9b4SJoseph Chen 	sha_context ctx;
64008ec9b4SJoseph Chen 
65008ec9b4SJoseph Chen 	if (!name)
66008ec9b4SJoseph Chen 		return -EINVAL;
67008ec9b4SJoseph Chen 
68008ec9b4SJoseph Chen 	if (!strcmp(name, "sha1"))
69008ec9b4SJoseph Chen 		ctx.algo = CRYPTO_SHA1;
70008ec9b4SJoseph Chen 	else if (!strcmp(name, "sha256"))
71008ec9b4SJoseph Chen 		ctx.algo = CRYPTO_SHA256;
72008ec9b4SJoseph Chen 	else
73008ec9b4SJoseph Chen 		return -EPERM;
74008ec9b4SJoseph Chen 
75008ec9b4SJoseph Chen 	dev = crypto_get_device(ctx.algo);
76008ec9b4SJoseph Chen 	if (!dev) {
77008ec9b4SJoseph Chen 		printf("No crypto device for expected capability\n");
78008ec9b4SJoseph Chen 		return -ENODEV;
79008ec9b4SJoseph Chen 	}
80008ec9b4SJoseph Chen 
81008ec9b4SJoseph Chen 	return crypto_sha_regions_csum(dev, &ctx, region,
82008ec9b4SJoseph Chen 				       region_count, checksum);
83008ec9b4SJoseph Chen }
841a768a29SJoseph Chen #endif
851a768a29SJoseph Chen #endif
861a768a29SJoseph Chen 
hash_calculate(const char * name,const struct image_region region[],int region_count,uint8_t * checksum)87008ec9b4SJoseph Chen int hash_calculate(const char *name,
88008ec9b4SJoseph Chen 		   const struct image_region region[],
89008ec9b4SJoseph Chen 		   int region_count, uint8_t *checksum)
90008ec9b4SJoseph Chen {
911a768a29SJoseph Chen #if defined(USE_HOSTCC)
921a768a29SJoseph Chen 	return rsa_hash_calculate(name, region, region_count, checksum);
931a768a29SJoseph Chen #else
94*82a88d02SJoseph Chen 	/*
95*82a88d02SJoseph Chen 	 * Don't delete hw_rsa_hash_calculate() for some platform doesn't
96*82a88d02SJoseph Chen 	 * want to use rk-crypto depend on soft sha1/256 dispatch path.
97*82a88d02SJoseph Chen 	 *
98*82a88d02SJoseph Chen 	 * Because CONFIG_SHA1/256=y and CONFIG_SPL_HASH_SUPPORT=y(if spl)
99*82a88d02SJoseph Chen 	 * increase the code size.
100*82a88d02SJoseph Chen 	 */
101*82a88d02SJoseph Chen #if CONFIG_IS_ENABLED(ARMV8_CRYPTO) || !CONFIG_IS_ENABLED(FIT_HW_CRYPTO)
1021a768a29SJoseph Chen 	return rsa_hash_calculate(name, region, region_count, checksum);
1031a768a29SJoseph Chen #else
1041a768a29SJoseph Chen 	return hw_rsa_hash_calculate(name, region, region_count, checksum);
1051a768a29SJoseph Chen #endif
1061a768a29SJoseph Chen #endif
107008ec9b4SJoseph Chen }
108