hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/crypto/sha256_generic.c
....@@ -1,21 +1,11 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
2
- * Cryptographic API.
3
- *
4
- * SHA-256, as specified in
5
- * http://csrc.nist.gov/groups/STM/cavp/documents/shs/sha256-384-512.pdf
6
- *
7
- * SHA-256 code by Jean-Luc Cooke <jlcooke@certainkey.com>.
3
+ * Crypto API wrapper for the generic SHA256 code from lib/crypto/sha256.c
84 *
95 * Copyright (c) Jean-Luc Cooke <jlcooke@certainkey.com>
106 * Copyright (c) Andrew McDonald <andrew@mcdonald.org.uk>
117 * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
128 * SHA224 Support Copyright 2007 Intel Corporation <jonathan.lynch@intel.com>
13
- *
14
- * This program is free software; you can redistribute it and/or modify it
15
- * under the terms of the GNU General Public License as published by the Free
16
- * Software Foundation; either version 2 of the License, or (at your option)
17
- * any later version.
18
- *
199 */
2010 #include <crypto/internal/hash.h>
2111 #include <linux/init.h>
....@@ -43,229 +33,48 @@
4333 };
4434 EXPORT_SYMBOL_GPL(sha256_zero_message_hash);
4535
46
-static inline u32 Ch(u32 x, u32 y, u32 z)
36
+static int crypto_sha256_init(struct shash_desc *desc)
4737 {
48
- return z ^ (x & (y ^ z));
38
+ sha256_init(shash_desc_ctx(desc));
39
+ return 0;
4940 }
5041
51
-static inline u32 Maj(u32 x, u32 y, u32 z)
42
+static int crypto_sha224_init(struct shash_desc *desc)
5243 {
53
- return (x & y) | (z & (x | y));
54
-}
55
-
56
-#define e0(x) (ror32(x, 2) ^ ror32(x,13) ^ ror32(x,22))
57
-#define e1(x) (ror32(x, 6) ^ ror32(x,11) ^ ror32(x,25))
58
-#define s0(x) (ror32(x, 7) ^ ror32(x,18) ^ (x >> 3))
59
-#define s1(x) (ror32(x,17) ^ ror32(x,19) ^ (x >> 10))
60
-
61
-static inline void LOAD_OP(int I, u32 *W, const u8 *input)
62
-{
63
- W[I] = get_unaligned_be32((__u32 *)input + I);
64
-}
65
-
66
-static inline void BLEND_OP(int I, u32 *W)
67
-{
68
- W[I] = s1(W[I-2]) + W[I-7] + s0(W[I-15]) + W[I-16];
69
-}
70
-
71
-static void sha256_transform(u32 *state, const u8 *input)
72
-{
73
- u32 a, b, c, d, e, f, g, h, t1, t2;
74
- u32 W[64];
75
- int i;
76
-
77
- /* load the input */
78
- for (i = 0; i < 16; i++)
79
- LOAD_OP(i, W, input);
80
-
81
- /* now blend */
82
- for (i = 16; i < 64; i++)
83
- BLEND_OP(i, W);
84
-
85
- /* load the state into our registers */
86
- a=state[0]; b=state[1]; c=state[2]; d=state[3];
87
- e=state[4]; f=state[5]; g=state[6]; h=state[7];
88
-
89
- /* now iterate */
90
- t1 = h + e1(e) + Ch(e,f,g) + 0x428a2f98 + W[ 0];
91
- t2 = e0(a) + Maj(a,b,c); d+=t1; h=t1+t2;
92
- t1 = g + e1(d) + Ch(d,e,f) + 0x71374491 + W[ 1];
93
- t2 = e0(h) + Maj(h,a,b); c+=t1; g=t1+t2;
94
- t1 = f + e1(c) + Ch(c,d,e) + 0xb5c0fbcf + W[ 2];
95
- t2 = e0(g) + Maj(g,h,a); b+=t1; f=t1+t2;
96
- t1 = e + e1(b) + Ch(b,c,d) + 0xe9b5dba5 + W[ 3];
97
- t2 = e0(f) + Maj(f,g,h); a+=t1; e=t1+t2;
98
- t1 = d + e1(a) + Ch(a,b,c) + 0x3956c25b + W[ 4];
99
- t2 = e0(e) + Maj(e,f,g); h+=t1; d=t1+t2;
100
- t1 = c + e1(h) + Ch(h,a,b) + 0x59f111f1 + W[ 5];
101
- t2 = e0(d) + Maj(d,e,f); g+=t1; c=t1+t2;
102
- t1 = b + e1(g) + Ch(g,h,a) + 0x923f82a4 + W[ 6];
103
- t2 = e0(c) + Maj(c,d,e); f+=t1; b=t1+t2;
104
- t1 = a + e1(f) + Ch(f,g,h) + 0xab1c5ed5 + W[ 7];
105
- t2 = e0(b) + Maj(b,c,d); e+=t1; a=t1+t2;
106
-
107
- t1 = h + e1(e) + Ch(e,f,g) + 0xd807aa98 + W[ 8];
108
- t2 = e0(a) + Maj(a,b,c); d+=t1; h=t1+t2;
109
- t1 = g + e1(d) + Ch(d,e,f) + 0x12835b01 + W[ 9];
110
- t2 = e0(h) + Maj(h,a,b); c+=t1; g=t1+t2;
111
- t1 = f + e1(c) + Ch(c,d,e) + 0x243185be + W[10];
112
- t2 = e0(g) + Maj(g,h,a); b+=t1; f=t1+t2;
113
- t1 = e + e1(b) + Ch(b,c,d) + 0x550c7dc3 + W[11];
114
- t2 = e0(f) + Maj(f,g,h); a+=t1; e=t1+t2;
115
- t1 = d + e1(a) + Ch(a,b,c) + 0x72be5d74 + W[12];
116
- t2 = e0(e) + Maj(e,f,g); h+=t1; d=t1+t2;
117
- t1 = c + e1(h) + Ch(h,a,b) + 0x80deb1fe + W[13];
118
- t2 = e0(d) + Maj(d,e,f); g+=t1; c=t1+t2;
119
- t1 = b + e1(g) + Ch(g,h,a) + 0x9bdc06a7 + W[14];
120
- t2 = e0(c) + Maj(c,d,e); f+=t1; b=t1+t2;
121
- t1 = a + e1(f) + Ch(f,g,h) + 0xc19bf174 + W[15];
122
- t2 = e0(b) + Maj(b,c,d); e+=t1; a=t1+t2;
123
-
124
- t1 = h + e1(e) + Ch(e,f,g) + 0xe49b69c1 + W[16];
125
- t2 = e0(a) + Maj(a,b,c); d+=t1; h=t1+t2;
126
- t1 = g + e1(d) + Ch(d,e,f) + 0xefbe4786 + W[17];
127
- t2 = e0(h) + Maj(h,a,b); c+=t1; g=t1+t2;
128
- t1 = f + e1(c) + Ch(c,d,e) + 0x0fc19dc6 + W[18];
129
- t2 = e0(g) + Maj(g,h,a); b+=t1; f=t1+t2;
130
- t1 = e + e1(b) + Ch(b,c,d) + 0x240ca1cc + W[19];
131
- t2 = e0(f) + Maj(f,g,h); a+=t1; e=t1+t2;
132
- t1 = d + e1(a) + Ch(a,b,c) + 0x2de92c6f + W[20];
133
- t2 = e0(e) + Maj(e,f,g); h+=t1; d=t1+t2;
134
- t1 = c + e1(h) + Ch(h,a,b) + 0x4a7484aa + W[21];
135
- t2 = e0(d) + Maj(d,e,f); g+=t1; c=t1+t2;
136
- t1 = b + e1(g) + Ch(g,h,a) + 0x5cb0a9dc + W[22];
137
- t2 = e0(c) + Maj(c,d,e); f+=t1; b=t1+t2;
138
- t1 = a + e1(f) + Ch(f,g,h) + 0x76f988da + W[23];
139
- t2 = e0(b) + Maj(b,c,d); e+=t1; a=t1+t2;
140
-
141
- t1 = h + e1(e) + Ch(e,f,g) + 0x983e5152 + W[24];
142
- t2 = e0(a) + Maj(a,b,c); d+=t1; h=t1+t2;
143
- t1 = g + e1(d) + Ch(d,e,f) + 0xa831c66d + W[25];
144
- t2 = e0(h) + Maj(h,a,b); c+=t1; g=t1+t2;
145
- t1 = f + e1(c) + Ch(c,d,e) + 0xb00327c8 + W[26];
146
- t2 = e0(g) + Maj(g,h,a); b+=t1; f=t1+t2;
147
- t1 = e + e1(b) + Ch(b,c,d) + 0xbf597fc7 + W[27];
148
- t2 = e0(f) + Maj(f,g,h); a+=t1; e=t1+t2;
149
- t1 = d + e1(a) + Ch(a,b,c) + 0xc6e00bf3 + W[28];
150
- t2 = e0(e) + Maj(e,f,g); h+=t1; d=t1+t2;
151
- t1 = c + e1(h) + Ch(h,a,b) + 0xd5a79147 + W[29];
152
- t2 = e0(d) + Maj(d,e,f); g+=t1; c=t1+t2;
153
- t1 = b + e1(g) + Ch(g,h,a) + 0x06ca6351 + W[30];
154
- t2 = e0(c) + Maj(c,d,e); f+=t1; b=t1+t2;
155
- t1 = a + e1(f) + Ch(f,g,h) + 0x14292967 + W[31];
156
- t2 = e0(b) + Maj(b,c,d); e+=t1; a=t1+t2;
157
-
158
- t1 = h + e1(e) + Ch(e,f,g) + 0x27b70a85 + W[32];
159
- t2 = e0(a) + Maj(a,b,c); d+=t1; h=t1+t2;
160
- t1 = g + e1(d) + Ch(d,e,f) + 0x2e1b2138 + W[33];
161
- t2 = e0(h) + Maj(h,a,b); c+=t1; g=t1+t2;
162
- t1 = f + e1(c) + Ch(c,d,e) + 0x4d2c6dfc + W[34];
163
- t2 = e0(g) + Maj(g,h,a); b+=t1; f=t1+t2;
164
- t1 = e + e1(b) + Ch(b,c,d) + 0x53380d13 + W[35];
165
- t2 = e0(f) + Maj(f,g,h); a+=t1; e=t1+t2;
166
- t1 = d + e1(a) + Ch(a,b,c) + 0x650a7354 + W[36];
167
- t2 = e0(e) + Maj(e,f,g); h+=t1; d=t1+t2;
168
- t1 = c + e1(h) + Ch(h,a,b) + 0x766a0abb + W[37];
169
- t2 = e0(d) + Maj(d,e,f); g+=t1; c=t1+t2;
170
- t1 = b + e1(g) + Ch(g,h,a) + 0x81c2c92e + W[38];
171
- t2 = e0(c) + Maj(c,d,e); f+=t1; b=t1+t2;
172
- t1 = a + e1(f) + Ch(f,g,h) + 0x92722c85 + W[39];
173
- t2 = e0(b) + Maj(b,c,d); e+=t1; a=t1+t2;
174
-
175
- t1 = h + e1(e) + Ch(e,f,g) + 0xa2bfe8a1 + W[40];
176
- t2 = e0(a) + Maj(a,b,c); d+=t1; h=t1+t2;
177
- t1 = g + e1(d) + Ch(d,e,f) + 0xa81a664b + W[41];
178
- t2 = e0(h) + Maj(h,a,b); c+=t1; g=t1+t2;
179
- t1 = f + e1(c) + Ch(c,d,e) + 0xc24b8b70 + W[42];
180
- t2 = e0(g) + Maj(g,h,a); b+=t1; f=t1+t2;
181
- t1 = e + e1(b) + Ch(b,c,d) + 0xc76c51a3 + W[43];
182
- t2 = e0(f) + Maj(f,g,h); a+=t1; e=t1+t2;
183
- t1 = d + e1(a) + Ch(a,b,c) + 0xd192e819 + W[44];
184
- t2 = e0(e) + Maj(e,f,g); h+=t1; d=t1+t2;
185
- t1 = c + e1(h) + Ch(h,a,b) + 0xd6990624 + W[45];
186
- t2 = e0(d) + Maj(d,e,f); g+=t1; c=t1+t2;
187
- t1 = b + e1(g) + Ch(g,h,a) + 0xf40e3585 + W[46];
188
- t2 = e0(c) + Maj(c,d,e); f+=t1; b=t1+t2;
189
- t1 = a + e1(f) + Ch(f,g,h) + 0x106aa070 + W[47];
190
- t2 = e0(b) + Maj(b,c,d); e+=t1; a=t1+t2;
191
-
192
- t1 = h + e1(e) + Ch(e,f,g) + 0x19a4c116 + W[48];
193
- t2 = e0(a) + Maj(a,b,c); d+=t1; h=t1+t2;
194
- t1 = g + e1(d) + Ch(d,e,f) + 0x1e376c08 + W[49];
195
- t2 = e0(h) + Maj(h,a,b); c+=t1; g=t1+t2;
196
- t1 = f + e1(c) + Ch(c,d,e) + 0x2748774c + W[50];
197
- t2 = e0(g) + Maj(g,h,a); b+=t1; f=t1+t2;
198
- t1 = e + e1(b) + Ch(b,c,d) + 0x34b0bcb5 + W[51];
199
- t2 = e0(f) + Maj(f,g,h); a+=t1; e=t1+t2;
200
- t1 = d + e1(a) + Ch(a,b,c) + 0x391c0cb3 + W[52];
201
- t2 = e0(e) + Maj(e,f,g); h+=t1; d=t1+t2;
202
- t1 = c + e1(h) + Ch(h,a,b) + 0x4ed8aa4a + W[53];
203
- t2 = e0(d) + Maj(d,e,f); g+=t1; c=t1+t2;
204
- t1 = b + e1(g) + Ch(g,h,a) + 0x5b9cca4f + W[54];
205
- t2 = e0(c) + Maj(c,d,e); f+=t1; b=t1+t2;
206
- t1 = a + e1(f) + Ch(f,g,h) + 0x682e6ff3 + W[55];
207
- t2 = e0(b) + Maj(b,c,d); e+=t1; a=t1+t2;
208
-
209
- t1 = h + e1(e) + Ch(e,f,g) + 0x748f82ee + W[56];
210
- t2 = e0(a) + Maj(a,b,c); d+=t1; h=t1+t2;
211
- t1 = g + e1(d) + Ch(d,e,f) + 0x78a5636f + W[57];
212
- t2 = e0(h) + Maj(h,a,b); c+=t1; g=t1+t2;
213
- t1 = f + e1(c) + Ch(c,d,e) + 0x84c87814 + W[58];
214
- t2 = e0(g) + Maj(g,h,a); b+=t1; f=t1+t2;
215
- t1 = e + e1(b) + Ch(b,c,d) + 0x8cc70208 + W[59];
216
- t2 = e0(f) + Maj(f,g,h); a+=t1; e=t1+t2;
217
- t1 = d + e1(a) + Ch(a,b,c) + 0x90befffa + W[60];
218
- t2 = e0(e) + Maj(e,f,g); h+=t1; d=t1+t2;
219
- t1 = c + e1(h) + Ch(h,a,b) + 0xa4506ceb + W[61];
220
- t2 = e0(d) + Maj(d,e,f); g+=t1; c=t1+t2;
221
- t1 = b + e1(g) + Ch(g,h,a) + 0xbef9a3f7 + W[62];
222
- t2 = e0(c) + Maj(c,d,e); f+=t1; b=t1+t2;
223
- t1 = a + e1(f) + Ch(f,g,h) + 0xc67178f2 + W[63];
224
- t2 = e0(b) + Maj(b,c,d); e+=t1; a=t1+t2;
225
-
226
- state[0] += a; state[1] += b; state[2] += c; state[3] += d;
227
- state[4] += e; state[5] += f; state[6] += g; state[7] += h;
228
-
229
- /* clear any sensitive info... */
230
- a = b = c = d = e = f = g = h = t1 = t2 = 0;
231
- memzero_explicit(W, 64 * sizeof(u32));
232
-}
233
-
234
-static void sha256_generic_block_fn(struct sha256_state *sst, u8 const *src,
235
- int blocks)
236
-{
237
- while (blocks--) {
238
- sha256_transform(sst->state, src);
239
- src += SHA256_BLOCK_SIZE;
240
- }
44
+ sha224_init(shash_desc_ctx(desc));
45
+ return 0;
24146 }
24247
24348 int crypto_sha256_update(struct shash_desc *desc, const u8 *data,
24449 unsigned int len)
24550 {
246
- return sha256_base_do_update(desc, data, len, sha256_generic_block_fn);
51
+ sha256_update(shash_desc_ctx(desc), data, len);
52
+ return 0;
24753 }
24854 EXPORT_SYMBOL(crypto_sha256_update);
24955
250
-static int sha256_final(struct shash_desc *desc, u8 *out)
56
+static int crypto_sha256_final(struct shash_desc *desc, u8 *out)
25157 {
252
- sha256_base_do_finalize(desc, sha256_generic_block_fn);
253
- return sha256_base_finish(desc, out);
58
+ if (crypto_shash_digestsize(desc->tfm) == SHA224_DIGEST_SIZE)
59
+ sha224_final(shash_desc_ctx(desc), out);
60
+ else
61
+ sha256_final(shash_desc_ctx(desc), out);
62
+ return 0;
25463 }
25564
25665 int crypto_sha256_finup(struct shash_desc *desc, const u8 *data,
25766 unsigned int len, u8 *hash)
25867 {
259
- sha256_base_do_update(desc, data, len, sha256_generic_block_fn);
260
- return sha256_final(desc, hash);
68
+ sha256_update(shash_desc_ctx(desc), data, len);
69
+ return crypto_sha256_final(desc, hash);
26170 }
26271 EXPORT_SYMBOL(crypto_sha256_finup);
26372
26473 static struct shash_alg sha256_algs[2] = { {
26574 .digestsize = SHA256_DIGEST_SIZE,
266
- .init = sha256_base_init,
75
+ .init = crypto_sha256_init,
26776 .update = crypto_sha256_update,
268
- .final = sha256_final,
77
+ .final = crypto_sha256_final,
26978 .finup = crypto_sha256_finup,
27079 .descsize = sizeof(struct sha256_state),
27180 .base = {
....@@ -277,9 +86,9 @@
27786 }
27887 }, {
27988 .digestsize = SHA224_DIGEST_SIZE,
280
- .init = sha224_base_init,
89
+ .init = crypto_sha224_init,
28190 .update = crypto_sha256_update,
282
- .final = sha256_final,
91
+ .final = crypto_sha256_final,
28392 .finup = crypto_sha256_finup,
28493 .descsize = sizeof(struct sha256_state),
28594 .base = {
....@@ -301,7 +110,7 @@
301110 crypto_unregister_shashes(sha256_algs, ARRAY_SIZE(sha256_algs));
302111 }
303112
304
-module_init(sha256_generic_mod_init);
113
+subsys_initcall(sha256_generic_mod_init);
305114 module_exit(sha256_generic_mod_fini);
306115
307116 MODULE_LICENSE("GPL");