1 // SPDX-License-Identifier: GPL-2.0+
3 * FIPS-180-2 compliant SHA-256 implementation
5 * Copyright (C) 2001-2003 Christophe Devine
10 #include <linux/string.h>
13 #endif /* USE_HOSTCC */
15 #include <u-boot/sha256.h>
17 #include <linux/compiler_attributes.h>
19 const uint8_t sha256_der_prefix[SHA256_DER_LEN] = {
20 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86,
21 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05,
26 * 32-bit integer manipulation macros (big endian)
29 #define GET_UINT32_BE(n,b,i) { \
30 (n) = ( (unsigned long) (b)[(i) ] << 24 ) \
31 | ( (unsigned long) (b)[(i) + 1] << 16 ) \
32 | ( (unsigned long) (b)[(i) + 2] << 8 ) \
33 | ( (unsigned long) (b)[(i) + 3] ); \
37 #define PUT_UINT32_BE(n,b,i) { \
38 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
39 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
40 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
41 (b)[(i) + 3] = (unsigned char) ( (n) ); \
45 void sha256_starts(sha256_context * ctx)
50 ctx->state[0] = 0x6A09E667;
51 ctx->state[1] = 0xBB67AE85;
52 ctx->state[2] = 0x3C6EF372;
53 ctx->state[3] = 0xA54FF53A;
54 ctx->state[4] = 0x510E527F;
55 ctx->state[5] = 0x9B05688C;
56 ctx->state[6] = 0x1F83D9AB;
57 ctx->state[7] = 0x5BE0CD19;
60 static void sha256_process_one(sha256_context *ctx, const uint8_t data[64])
62 uint32_t temp1, temp2;
64 uint32_t A, B, C, D, E, F, G, H;
66 GET_UINT32_BE(W[0], data, 0);
67 GET_UINT32_BE(W[1], data, 4);
68 GET_UINT32_BE(W[2], data, 8);
69 GET_UINT32_BE(W[3], data, 12);
70 GET_UINT32_BE(W[4], data, 16);
71 GET_UINT32_BE(W[5], data, 20);
72 GET_UINT32_BE(W[6], data, 24);
73 GET_UINT32_BE(W[7], data, 28);
74 GET_UINT32_BE(W[8], data, 32);
75 GET_UINT32_BE(W[9], data, 36);
76 GET_UINT32_BE(W[10], data, 40);
77 GET_UINT32_BE(W[11], data, 44);
78 GET_UINT32_BE(W[12], data, 48);
79 GET_UINT32_BE(W[13], data, 52);
80 GET_UINT32_BE(W[14], data, 56);
81 GET_UINT32_BE(W[15], data, 60);
83 #define SHR(x,n) ((x & 0xFFFFFFFF) >> n)
84 #define ROTR(x,n) (SHR(x,n) | (x << (32 - n)))
86 #define S0(x) (ROTR(x, 7) ^ ROTR(x,18) ^ SHR(x, 3))
87 #define S1(x) (ROTR(x,17) ^ ROTR(x,19) ^ SHR(x,10))
89 #define S2(x) (ROTR(x, 2) ^ ROTR(x,13) ^ ROTR(x,22))
90 #define S3(x) (ROTR(x, 6) ^ ROTR(x,11) ^ ROTR(x,25))
92 #define F0(x,y,z) ((x & y) | (z & (x | y)))
93 #define F1(x,y,z) (z ^ (x & (y ^ z)))
97 W[t] = S1(W[t - 2]) + W[t - 7] + \
98 S0(W[t - 15]) + W[t - 16] \
101 #define P(a,b,c,d,e,f,g,h,x,K) { \
102 temp1 = h + S3(e) + F1(e,f,g) + K + x; \
103 temp2 = S2(a) + F0(a,b,c); \
104 d += temp1; h = temp1 + temp2; \
116 P(A, B, C, D, E, F, G, H, W[0], 0x428A2F98);
117 P(H, A, B, C, D, E, F, G, W[1], 0x71374491);
118 P(G, H, A, B, C, D, E, F, W[2], 0xB5C0FBCF);
119 P(F, G, H, A, B, C, D, E, W[3], 0xE9B5DBA5);
120 P(E, F, G, H, A, B, C, D, W[4], 0x3956C25B);
121 P(D, E, F, G, H, A, B, C, W[5], 0x59F111F1);
122 P(C, D, E, F, G, H, A, B, W[6], 0x923F82A4);
123 P(B, C, D, E, F, G, H, A, W[7], 0xAB1C5ED5);
124 P(A, B, C, D, E, F, G, H, W[8], 0xD807AA98);
125 P(H, A, B, C, D, E, F, G, W[9], 0x12835B01);
126 P(G, H, A, B, C, D, E, F, W[10], 0x243185BE);
127 P(F, G, H, A, B, C, D, E, W[11], 0x550C7DC3);
128 P(E, F, G, H, A, B, C, D, W[12], 0x72BE5D74);
129 P(D, E, F, G, H, A, B, C, W[13], 0x80DEB1FE);
130 P(C, D, E, F, G, H, A, B, W[14], 0x9BDC06A7);
131 P(B, C, D, E, F, G, H, A, W[15], 0xC19BF174);
132 P(A, B, C, D, E, F, G, H, R(16), 0xE49B69C1);
133 P(H, A, B, C, D, E, F, G, R(17), 0xEFBE4786);
134 P(G, H, A, B, C, D, E, F, R(18), 0x0FC19DC6);
135 P(F, G, H, A, B, C, D, E, R(19), 0x240CA1CC);
136 P(E, F, G, H, A, B, C, D, R(20), 0x2DE92C6F);
137 P(D, E, F, G, H, A, B, C, R(21), 0x4A7484AA);
138 P(C, D, E, F, G, H, A, B, R(22), 0x5CB0A9DC);
139 P(B, C, D, E, F, G, H, A, R(23), 0x76F988DA);
140 P(A, B, C, D, E, F, G, H, R(24), 0x983E5152);
141 P(H, A, B, C, D, E, F, G, R(25), 0xA831C66D);
142 P(G, H, A, B, C, D, E, F, R(26), 0xB00327C8);
143 P(F, G, H, A, B, C, D, E, R(27), 0xBF597FC7);
144 P(E, F, G, H, A, B, C, D, R(28), 0xC6E00BF3);
145 P(D, E, F, G, H, A, B, C, R(29), 0xD5A79147);
146 P(C, D, E, F, G, H, A, B, R(30), 0x06CA6351);
147 P(B, C, D, E, F, G, H, A, R(31), 0x14292967);
148 P(A, B, C, D, E, F, G, H, R(32), 0x27B70A85);
149 P(H, A, B, C, D, E, F, G, R(33), 0x2E1B2138);
150 P(G, H, A, B, C, D, E, F, R(34), 0x4D2C6DFC);
151 P(F, G, H, A, B, C, D, E, R(35), 0x53380D13);
152 P(E, F, G, H, A, B, C, D, R(36), 0x650A7354);
153 P(D, E, F, G, H, A, B, C, R(37), 0x766A0ABB);
154 P(C, D, E, F, G, H, A, B, R(38), 0x81C2C92E);
155 P(B, C, D, E, F, G, H, A, R(39), 0x92722C85);
156 P(A, B, C, D, E, F, G, H, R(40), 0xA2BFE8A1);
157 P(H, A, B, C, D, E, F, G, R(41), 0xA81A664B);
158 P(G, H, A, B, C, D, E, F, R(42), 0xC24B8B70);
159 P(F, G, H, A, B, C, D, E, R(43), 0xC76C51A3);
160 P(E, F, G, H, A, B, C, D, R(44), 0xD192E819);
161 P(D, E, F, G, H, A, B, C, R(45), 0xD6990624);
162 P(C, D, E, F, G, H, A, B, R(46), 0xF40E3585);
163 P(B, C, D, E, F, G, H, A, R(47), 0x106AA070);
164 P(A, B, C, D, E, F, G, H, R(48), 0x19A4C116);
165 P(H, A, B, C, D, E, F, G, R(49), 0x1E376C08);
166 P(G, H, A, B, C, D, E, F, R(50), 0x2748774C);
167 P(F, G, H, A, B, C, D, E, R(51), 0x34B0BCB5);
168 P(E, F, G, H, A, B, C, D, R(52), 0x391C0CB3);
169 P(D, E, F, G, H, A, B, C, R(53), 0x4ED8AA4A);
170 P(C, D, E, F, G, H, A, B, R(54), 0x5B9CCA4F);
171 P(B, C, D, E, F, G, H, A, R(55), 0x682E6FF3);
172 P(A, B, C, D, E, F, G, H, R(56), 0x748F82EE);
173 P(H, A, B, C, D, E, F, G, R(57), 0x78A5636F);
174 P(G, H, A, B, C, D, E, F, R(58), 0x84C87814);
175 P(F, G, H, A, B, C, D, E, R(59), 0x8CC70208);
176 P(E, F, G, H, A, B, C, D, R(60), 0x90BEFFFA);
177 P(D, E, F, G, H, A, B, C, R(61), 0xA4506CEB);
178 P(C, D, E, F, G, H, A, B, R(62), 0xBEF9A3F7);
179 P(B, C, D, E, F, G, H, A, R(63), 0xC67178F2);
191 __weak void sha256_process(sha256_context *ctx, const unsigned char *data,
198 sha256_process_one(ctx, data);
203 void sha256_update(sha256_context *ctx, const uint8_t *input, uint32_t length)
210 left = ctx->total[0] & 0x3F;
213 ctx->total[0] += length;
214 ctx->total[0] &= 0xFFFFFFFF;
216 if (ctx->total[0] < length)
219 if (left && length >= fill) {
220 memcpy((void *) (ctx->buffer + left), (void *) input, fill);
221 sha256_process(ctx, ctx->buffer, 1);
227 sha256_process(ctx, input, length / 64);
228 input += length / 64 * 64;
229 length = length % 64;
232 memcpy((void *) (ctx->buffer + left), (void *) input, length);
235 static uint8_t sha256_padding[64] = {
236 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
237 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
238 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
239 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
242 void sha256_finish(sha256_context * ctx, uint8_t digest[32])
248 high = ((ctx->total[0] >> 29)
249 | (ctx->total[1] << 3));
250 low = (ctx->total[0] << 3);
252 PUT_UINT32_BE(high, msglen, 0);
253 PUT_UINT32_BE(low, msglen, 4);
255 last = ctx->total[0] & 0x3F;
256 padn = (last < 56) ? (56 - last) : (120 - last);
258 sha256_update(ctx, sha256_padding, padn);
259 sha256_update(ctx, msglen, 8);
261 PUT_UINT32_BE(ctx->state[0], digest, 0);
262 PUT_UINT32_BE(ctx->state[1], digest, 4);
263 PUT_UINT32_BE(ctx->state[2], digest, 8);
264 PUT_UINT32_BE(ctx->state[3], digest, 12);
265 PUT_UINT32_BE(ctx->state[4], digest, 16);
266 PUT_UINT32_BE(ctx->state[5], digest, 20);
267 PUT_UINT32_BE(ctx->state[6], digest, 24);
268 PUT_UINT32_BE(ctx->state[7], digest, 28);
272 * Output = SHA-256( input buffer ). Trigger the watchdog every 'chunk_sz'
273 * bytes of input processed.
275 void sha256_csum_wd(const unsigned char *input, unsigned int ilen,
276 unsigned char *output, unsigned int chunk_sz)
279 #if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
280 const unsigned char *end;
287 #if defined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG)
288 curr = (unsigned char *)input;
292 if (chunk > chunk_sz)
294 sha256_update(&ctx, curr, chunk);
299 sha256_update(&ctx, input, ilen);
302 sha256_finish(&ctx, output);