xref: /openbmc/u-boot/lib/rsa/rsa-checksum.c (revision 2290fe06)
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 <asm/errno.h>
12 #include <asm/unaligned.h>
13 #include <hash.h>
14 #else
15 #include "fdt_host.h"
16 #include <u-boot/sha1.h>
17 #include <u-boot/sha256.h>
18 #endif
19 #include <u-boot/rsa.h>
20 
21 /* PKCS 1.5 paddings as described in the RSA PKCS#1 v2.1 standard. */
22 
23 const uint8_t padding_sha256_rsa2048[RSA2048_BYTES - SHA256_SUM_LEN] = {
24 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
25 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
26 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
27 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
28 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
29 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
30 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
31 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
32 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
33 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
34 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
35 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
36 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
37 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
38 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
39 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x31, 0x30,
40 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05,
41 0x00, 0x04, 0x20
42 };
43 
44 const uint8_t padding_sha1_rsa2048[RSA2048_BYTES - SHA1_SUM_LEN] = {
45 	0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
46 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
47 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
48 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
49 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
50 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
51 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
52 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
53 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
54 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
55 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
56 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
57 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
58 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
59 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
60 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
61 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
62 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
63 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
64 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
65 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
66 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
67 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
68 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
69 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
70 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
71 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
72 	0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x21, 0x30,
73 	0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a,
74 	0x05, 0x00, 0x04, 0x14
75 };
76 
77 const uint8_t padding_sha256_rsa4096[RSA4096_BYTES - SHA256_SUM_LEN] = {
78 	0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
79 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
80 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
81 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
82 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
83 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
84 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
85 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
86 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
87 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
88 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
89 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
90 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
91 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
92 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
93 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
94 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
95 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
96 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
97 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
98 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
99 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
100 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
101 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
102 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
103 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
104 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
105 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
106 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
107 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
108 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
109 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
110 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
111 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
112 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
113 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
114 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
115 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
116 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
117 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
118 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
119 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
120 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
121 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
122 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
123 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
124 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
125 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
126 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
127 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
128 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
129 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
130 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
131 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
132 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
133 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
134 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
135 	0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x31, 0x30,
136 	0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65,
137 	0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20
138 };
139 
140 int hash_calculate(const char *name,
141 		    const struct image_region region[],
142 		    int region_count, uint8_t *checksum)
143 {
144 	struct hash_algo *algo;
145 	int ret = 0;
146 	void *ctx;
147 	uint32_t i;
148 	i = 0;
149 
150 	ret = hash_progressive_lookup_algo(name, &algo);
151 	if (ret)
152 		return ret;
153 
154 	ret = algo->hash_init(algo, &ctx);
155 	if (ret)
156 		return ret;
157 
158 	for (i = 0; i < region_count - 1; i++) {
159 		ret = algo->hash_update(algo, ctx, region[i].data,
160 					region[i].size, 0);
161 		if (ret)
162 			return ret;
163 	}
164 
165 	ret = algo->hash_update(algo, ctx, region[i].data, region[i].size, 1);
166 	if (ret)
167 		return ret;
168 	ret = algo->hash_finish(algo, ctx, checksum, algo->digest_size);
169 	if (ret)
170 		return ret;
171 
172 	return 0;
173 }
174