]> git.kernelconcepts.de Git - karo-tx-uboot.git/blob - lib/rsa/rsa-checksum.c
rsa: add sha256,rsa4096 algorithm
[karo-tx-uboot.git] / lib / rsa / rsa-checksum.c
1 /*
2  * Copyright (c) 2013, Andreas Oetken.
3  *
4  * SPDX-License-Identifier:    GPL-2.0+
5  */
6
7 #include <common.h>
8 #include <fdtdec.h>
9 #include <rsa.h>
10 #include <sha1.h>
11 #include <sha256.h>
12 #include <asm/byteorder.h>
13 #include <asm/errno.h>
14 #include <asm/unaligned.h>
15
16 /* PKCS 1.5 paddings as described in the RSA PKCS#1 v2.1 standard. */
17
18 const uint8_t padding_sha256_rsa2048[RSA2048_BYTES - SHA256_SUM_LEN] = {
19 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
20 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
21 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
22 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
23 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
24 0xff, 0xff, 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, 0x00, 0x30, 0x31, 0x30,
35 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05,
36 0x00, 0x04, 0x20
37 };
38
39 const uint8_t padding_sha1_rsa2048[RSA2048_BYTES - SHA1_SUM_LEN] = {
40         0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
41         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
42         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
43         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
44         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
45         0xff, 0xff, 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, 0x00, 0x30, 0x21, 0x30,
68         0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a,
69         0x05, 0x00, 0x04, 0x14
70 };
71
72 const uint8_t padding_sha256_rsa4096[RSA4096_BYTES - SHA256_SUM_LEN] = {
73         0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
74         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
75         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
76         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
77         0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
78         0xff, 0xff, 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, 0x00, 0x30, 0x31, 0x30,
131         0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65,
132         0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, 0x20
133 };
134
135 void sha1_calculate(const struct image_region region[], int region_count,
136                     uint8_t *checksum)
137 {
138         sha1_context ctx;
139         uint32_t i;
140         i = 0;
141
142         sha1_starts(&ctx);
143         for (i = 0; i < region_count; i++)
144                 sha1_update(&ctx, region[i].data, region[i].size);
145         sha1_finish(&ctx, checksum);
146 }
147
148 void sha256_calculate(const struct image_region region[], int region_count,
149                       uint8_t *checksum)
150 {
151         sha256_context ctx;
152         uint32_t i;
153         i = 0;
154
155         sha256_starts(&ctx);
156         for (i = 0; i < region_count; i++)
157                 sha256_update(&ctx, region[i].data, region[i].size);
158         sha256_finish(&ctx, checksum);
159 }