xref: /openbmc/u-boot/lib/rsa/rsa-checksum.c (revision 646257d1)
1*646257d1SHeiko Schocher /*
2*646257d1SHeiko Schocher  * Copyright (c) 2013, Andreas Oetken.
3*646257d1SHeiko Schocher  *
4*646257d1SHeiko Schocher  * SPDX-License-Identifier:    GPL-2.0+
5*646257d1SHeiko Schocher  */
6*646257d1SHeiko Schocher 
7*646257d1SHeiko Schocher #include <common.h>
8*646257d1SHeiko Schocher #include <fdtdec.h>
9*646257d1SHeiko Schocher #include <rsa.h>
10*646257d1SHeiko Schocher #include <sha1.h>
11*646257d1SHeiko Schocher #include <sha256.h>
12*646257d1SHeiko Schocher #include <asm/byteorder.h>
13*646257d1SHeiko Schocher #include <asm/errno.h>
14*646257d1SHeiko Schocher #include <asm/unaligned.h>
15*646257d1SHeiko Schocher 
16*646257d1SHeiko Schocher #define RSA2048_BYTES 256
17*646257d1SHeiko Schocher 
18*646257d1SHeiko Schocher /* PKCS 1.5 paddings as described in the RSA PKCS#1 v2.1 standard. */
19*646257d1SHeiko Schocher 
20*646257d1SHeiko Schocher const uint8_t padding_sha256_rsa2048[RSA2048_BYTES - SHA256_SUM_LEN] = {
21*646257d1SHeiko Schocher 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
22*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
23*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
24*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
25*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
26*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
27*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
28*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
29*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
30*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
31*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
32*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
33*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
34*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
35*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
36*646257d1SHeiko Schocher 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x31, 0x30,
37*646257d1SHeiko Schocher 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05,
38*646257d1SHeiko Schocher 0x00, 0x04, 0x20
39*646257d1SHeiko Schocher };
40*646257d1SHeiko Schocher 
41*646257d1SHeiko Schocher const uint8_t padding_sha1_rsa2048[RSA2048_BYTES - SHA1_SUM_LEN] = {
42*646257d1SHeiko Schocher 	0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
43*646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
44*646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
45*646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
46*646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
47*646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
48*646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
49*646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
50*646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
51*646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
52*646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
53*646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
54*646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
55*646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
56*646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
57*646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
58*646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
59*646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
60*646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
61*646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
62*646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
63*646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
64*646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
65*646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
66*646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
67*646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
68*646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
69*646257d1SHeiko Schocher 	0xff, 0xff, 0xff, 0xff, 0x00, 0x30, 0x21, 0x30,
70*646257d1SHeiko Schocher 	0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a,
71*646257d1SHeiko Schocher 	0x05, 0x00, 0x04, 0x14
72*646257d1SHeiko Schocher };
73*646257d1SHeiko Schocher 
74*646257d1SHeiko Schocher void sha1_calculate(const struct image_region region[], int region_count,
75*646257d1SHeiko Schocher 		    uint8_t *checksum)
76*646257d1SHeiko Schocher {
77*646257d1SHeiko Schocher 	sha1_context ctx;
78*646257d1SHeiko Schocher 	uint32_t i;
79*646257d1SHeiko Schocher 	i = 0;
80*646257d1SHeiko Schocher 
81*646257d1SHeiko Schocher 	sha1_starts(&ctx);
82*646257d1SHeiko Schocher 	for (i = 0; i < region_count; i++)
83*646257d1SHeiko Schocher 		sha1_update(&ctx, region[i].data, region[i].size);
84*646257d1SHeiko Schocher 	sha1_finish(&ctx, checksum);
85*646257d1SHeiko Schocher }
86*646257d1SHeiko Schocher 
87*646257d1SHeiko Schocher void sha256_calculate(const struct image_region region[], int region_count,
88*646257d1SHeiko Schocher 		      uint8_t *checksum)
89*646257d1SHeiko Schocher {
90*646257d1SHeiko Schocher 	sha256_context ctx;
91*646257d1SHeiko Schocher 	uint32_t i;
92*646257d1SHeiko Schocher 	i = 0;
93*646257d1SHeiko Schocher 
94*646257d1SHeiko Schocher 	sha256_starts(&ctx);
95*646257d1SHeiko Schocher 	for (i = 0; i < region_count; i++)
96*646257d1SHeiko Schocher 		sha256_update(&ctx, region[i].data, region[i].size);
97*646257d1SHeiko Schocher 	sha256_finish(&ctx, checksum);
98*646257d1SHeiko Schocher }
99