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