xref: /openbmc/u-boot/lib/rsa/rsa-checksum.c (revision b37b46f0)
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>
9646257d1SHeiko Schocher #include <fdtdec.h>
10646257d1SHeiko Schocher #include <asm/byteorder.h>
11646257d1SHeiko Schocher #include <asm/errno.h>
12646257d1SHeiko Schocher #include <asm/unaligned.h>
13*b37b46f0SRuchika Gupta #include <hash.h>
1429a23f9dSHeiko Schocher #else
1529a23f9dSHeiko Schocher #include "fdt_host.h"
162b9912e6SJeroen Hofstee #include <u-boot/sha1.h>
172b9912e6SJeroen Hofstee #include <u-boot/sha256.h>
18*b37b46f0SRuchika Gupta #endif
19*b37b46f0SRuchika Gupta #include <u-boot/rsa.h>
20646257d1SHeiko Schocher 
21646257d1SHeiko Schocher /* PKCS 1.5 paddings as described in the RSA PKCS#1 v2.1 standard. */
22646257d1SHeiko Schocher 
23646257d1SHeiko Schocher const uint8_t padding_sha256_rsa2048[RSA2048_BYTES - SHA256_SUM_LEN] = {
24646257d1SHeiko Schocher 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
25646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
26646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
27646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
28646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
29646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
30646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
31646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
32646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
33646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
34646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
35646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
36646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
37646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
38646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
39646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x31, 0x30,
40646257d1SHeiko Schocher 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05,
41646257d1SHeiko Schocher 0x00, 0x04, 0x20
42646257d1SHeiko Schocher };
43646257d1SHeiko Schocher 
44646257d1SHeiko Schocher const uint8_t padding_sha1_rsa2048[RSA2048_BYTES - SHA1_SUM_LEN] = {
45646257d1SHeiko Schocher 	0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
46646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
47646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
48646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
49646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
50646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
51646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
52646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
53646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
54646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
55646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
56646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
57646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
58646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
59646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
60646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
61646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
62646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
63646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
64646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
65646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
66646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
67646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
68646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
69646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
70646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
71646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
72646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x21, 0x30,
73646257d1SHeiko Schocher 	0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a,
74646257d1SHeiko Schocher 	0x05, 0x00, 0x04, 0x14
75646257d1SHeiko Schocher };
76646257d1SHeiko Schocher 
77db1b5f3dSHeiko Schocher const uint8_t padding_sha256_rsa4096[RSA4096_BYTES - SHA256_SUM_LEN] = {
78db1b5f3dSHeiko Schocher 	0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
79db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
80db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
81db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
82db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
83db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
84db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
85db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
86db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
87db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
88db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
89db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
90db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
91db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
92db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
93db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
94db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
95db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
96db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
97db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
98db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
99db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
100db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
101db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
102db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
103db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
104db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
105db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
106db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
107db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
108db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
109db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
110db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
111db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
112db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
113db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
114db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
115db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
116db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
117db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
118db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
119db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
120db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
121db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
122db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
123db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
124db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
125db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
126db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
127db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
128db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
129db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
130db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
131db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
132db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
133db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
134db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
135db1b5f3dSHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x31, 0x30,
136db1b5f3dSHeiko Schocher 	0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65,
137db1b5f3dSHeiko Schocher 	0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20
138db1b5f3dSHeiko Schocher };
139db1b5f3dSHeiko Schocher 
140*b37b46f0SRuchika Gupta int hash_calculate(const char *name,
141*b37b46f0SRuchika Gupta 		    const struct image_region region[],
142*b37b46f0SRuchika Gupta 		    int region_count, uint8_t *checksum)
143646257d1SHeiko Schocher {
144*b37b46f0SRuchika Gupta 	struct hash_algo *algo;
145*b37b46f0SRuchika Gupta 	int ret = 0;
146*b37b46f0SRuchika Gupta 	void *ctx;
147646257d1SHeiko Schocher 	uint32_t i;
148646257d1SHeiko Schocher 	i = 0;
149646257d1SHeiko Schocher 
150*b37b46f0SRuchika Gupta 	ret = hash_progressive_lookup_algo(name, &algo);
151*b37b46f0SRuchika Gupta 	if (ret)
152*b37b46f0SRuchika Gupta 		return ret;
153*b37b46f0SRuchika Gupta 
154*b37b46f0SRuchika Gupta 	ret = algo->hash_init(algo, &ctx);
155*b37b46f0SRuchika Gupta 	if (ret)
156*b37b46f0SRuchika Gupta 		return ret;
157*b37b46f0SRuchika Gupta 
158*b37b46f0SRuchika Gupta 	for (i = 0; i < region_count - 1; i++) {
159*b37b46f0SRuchika Gupta 		ret = algo->hash_update(algo, ctx, region[i].data,
160*b37b46f0SRuchika Gupta 					region[i].size, 0);
161*b37b46f0SRuchika Gupta 		if (ret)
162*b37b46f0SRuchika Gupta 			return ret;
163646257d1SHeiko Schocher 	}
164646257d1SHeiko Schocher 
165*b37b46f0SRuchika Gupta 	ret = algo->hash_update(algo, ctx, region[i].data, region[i].size, 1);
166*b37b46f0SRuchika Gupta 	if (ret)
167*b37b46f0SRuchika Gupta 		return ret;
168*b37b46f0SRuchika Gupta 	ret = algo->hash_finish(algo, ctx, checksum, algo->digest_size);
169*b37b46f0SRuchika Gupta 	if (ret)
170*b37b46f0SRuchika Gupta 		return ret;
171646257d1SHeiko Schocher 
172*b37b46f0SRuchika Gupta 	return 0;
173646257d1SHeiko Schocher }
174