Blame view

crypto/sha256_generic.c 10.7 KB
2874c5fd2   Thomas Gleixner   treewide: Replace...
1
  // SPDX-License-Identifier: GPL-2.0-or-later
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
3
4
5
  /*
   * Cryptographic API.
   *
   * SHA-256, as specified in
8c882f641   Adrian-Ken Rueegsegger   crypto: Fix dead ...
6
   * http://csrc.nist.gov/groups/STM/cavp/documents/shs/sha256-384-512.pdf
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
7
8
9
10
11
12
   *
   * SHA-256 code by Jean-Luc Cooke <jlcooke@certainkey.com>.
   *
   * Copyright (c) Jean-Luc Cooke <jlcooke@certainkey.com>
   * Copyright (c) Andrew McDonald <andrew@mcdonald.org.uk>
   * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
13
   * SHA224 Support Copyright 2007 Intel Corporation <jonathan.lynch@intel.com>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
14
   */
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
15
  #include <crypto/internal/hash.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
16
17
18
  #include <linux/init.h>
  #include <linux/module.h>
  #include <linux/mm.h>
06ace7a9b   Herbert Xu   [CRYPTO] Use stan...
19
  #include <linux/types.h>
5265eeb2b   Jan Glauber   [CRYPTO] sha: Add...
20
  #include <crypto/sha.h>
a2e5ba4fe   Ard Biesheuvel   crypto: sha256-ge...
21
  #include <crypto/sha256_base.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
22
  #include <asm/byteorder.h>
be34c4ef6   David S. Miller   crypto: sha - Han...
23
  #include <asm/unaligned.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
24

0c4c78de0   LABBE Corentin   crypto: hash - ad...
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
  const u8 sha224_zero_message_hash[SHA224_DIGEST_SIZE] = {
  	0xd1, 0x4a, 0x02, 0x8c, 0x2a, 0x3a, 0x2b, 0xc9, 0x47,
  	0x61, 0x02, 0xbb, 0x28, 0x82, 0x34, 0xc4, 0x15, 0xa2,
  	0xb0, 0x1f, 0x82, 0x8e, 0xa6, 0x2a, 0xc5, 0xb3, 0xe4,
  	0x2f
  };
  EXPORT_SYMBOL_GPL(sha224_zero_message_hash);
  
  const u8 sha256_zero_message_hash[SHA256_DIGEST_SIZE] = {
  	0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14,
  	0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f, 0xb9, 0x24,
  	0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c,
  	0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55
  };
  EXPORT_SYMBOL_GPL(sha256_zero_message_hash);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
40
41
42
43
44
45
46
47
48
49
50
51
52
53
  static inline u32 Ch(u32 x, u32 y, u32 z)
  {
  	return z ^ (x & (y ^ z));
  }
  
  static inline u32 Maj(u32 x, u32 y, u32 z)
  {
  	return (x & y) | (z & (x | y));
  }
  
  #define e0(x)       (ror32(x, 2) ^ ror32(x,13) ^ ror32(x,22))
  #define e1(x)       (ror32(x, 6) ^ ror32(x,11) ^ ror32(x,25))
  #define s0(x)       (ror32(x, 7) ^ ror32(x,18) ^ (x >> 3))
  #define s1(x)       (ror32(x,17) ^ ror32(x,19) ^ (x >> 10))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
54
55
  static inline void LOAD_OP(int I, u32 *W, const u8 *input)
  {
be34c4ef6   David S. Miller   crypto: sha - Han...
56
  	W[I] = get_unaligned_be32((__u32 *)input + I);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
  }
  
  static inline void BLEND_OP(int I, u32 *W)
  {
  	W[I] = s1(W[I-2]) + W[I-7] + s0(W[I-15]) + W[I-16];
  }
  
  static void sha256_transform(u32 *state, const u8 *input)
  {
  	u32 a, b, c, d, e, f, g, h, t1, t2;
  	u32 W[64];
  	int i;
  
  	/* load the input */
  	for (i = 0; i < 16; i++)
  		LOAD_OP(i, W, input);
  
  	/* now blend */
  	for (i = 16; i < 64; i++)
  		BLEND_OP(i, W);
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
77

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
  	/* load the state into our registers */
  	a=state[0];  b=state[1];  c=state[2];  d=state[3];
  	e=state[4];  f=state[5];  g=state[6];  h=state[7];
  
  	/* now iterate */
  	t1 = h + e1(e) + Ch(e,f,g) + 0x428a2f98 + W[ 0];
  	t2 = e0(a) + Maj(a,b,c);    d+=t1;    h=t1+t2;
  	t1 = g + e1(d) + Ch(d,e,f) + 0x71374491 + W[ 1];
  	t2 = e0(h) + Maj(h,a,b);    c+=t1;    g=t1+t2;
  	t1 = f + e1(c) + Ch(c,d,e) + 0xb5c0fbcf + W[ 2];
  	t2 = e0(g) + Maj(g,h,a);    b+=t1;    f=t1+t2;
  	t1 = e + e1(b) + Ch(b,c,d) + 0xe9b5dba5 + W[ 3];
  	t2 = e0(f) + Maj(f,g,h);    a+=t1;    e=t1+t2;
  	t1 = d + e1(a) + Ch(a,b,c) + 0x3956c25b + W[ 4];
  	t2 = e0(e) + Maj(e,f,g);    h+=t1;    d=t1+t2;
  	t1 = c + e1(h) + Ch(h,a,b) + 0x59f111f1 + W[ 5];
  	t2 = e0(d) + Maj(d,e,f);    g+=t1;    c=t1+t2;
  	t1 = b + e1(g) + Ch(g,h,a) + 0x923f82a4 + W[ 6];
  	t2 = e0(c) + Maj(c,d,e);    f+=t1;    b=t1+t2;
  	t1 = a + e1(f) + Ch(f,g,h) + 0xab1c5ed5 + W[ 7];
  	t2 = e0(b) + Maj(b,c,d);    e+=t1;    a=t1+t2;
  
  	t1 = h + e1(e) + Ch(e,f,g) + 0xd807aa98 + W[ 8];
  	t2 = e0(a) + Maj(a,b,c);    d+=t1;    h=t1+t2;
  	t1 = g + e1(d) + Ch(d,e,f) + 0x12835b01 + W[ 9];
  	t2 = e0(h) + Maj(h,a,b);    c+=t1;    g=t1+t2;
  	t1 = f + e1(c) + Ch(c,d,e) + 0x243185be + W[10];
  	t2 = e0(g) + Maj(g,h,a);    b+=t1;    f=t1+t2;
  	t1 = e + e1(b) + Ch(b,c,d) + 0x550c7dc3 + W[11];
  	t2 = e0(f) + Maj(f,g,h);    a+=t1;    e=t1+t2;
  	t1 = d + e1(a) + Ch(a,b,c) + 0x72be5d74 + W[12];
  	t2 = e0(e) + Maj(e,f,g);    h+=t1;    d=t1+t2;
  	t1 = c + e1(h) + Ch(h,a,b) + 0x80deb1fe + W[13];
  	t2 = e0(d) + Maj(d,e,f);    g+=t1;    c=t1+t2;
  	t1 = b + e1(g) + Ch(g,h,a) + 0x9bdc06a7 + W[14];
  	t2 = e0(c) + Maj(c,d,e);    f+=t1;    b=t1+t2;
  	t1 = a + e1(f) + Ch(f,g,h) + 0xc19bf174 + W[15];
  	t2 = e0(b) + Maj(b,c,d);    e+=t1;    a=t1+t2;
  
  	t1 = h + e1(e) + Ch(e,f,g) + 0xe49b69c1 + W[16];
  	t2 = e0(a) + Maj(a,b,c);    d+=t1;    h=t1+t2;
  	t1 = g + e1(d) + Ch(d,e,f) + 0xefbe4786 + W[17];
  	t2 = e0(h) + Maj(h,a,b);    c+=t1;    g=t1+t2;
  	t1 = f + e1(c) + Ch(c,d,e) + 0x0fc19dc6 + W[18];
  	t2 = e0(g) + Maj(g,h,a);    b+=t1;    f=t1+t2;
  	t1 = e + e1(b) + Ch(b,c,d) + 0x240ca1cc + W[19];
  	t2 = e0(f) + Maj(f,g,h);    a+=t1;    e=t1+t2;
  	t1 = d + e1(a) + Ch(a,b,c) + 0x2de92c6f + W[20];
  	t2 = e0(e) + Maj(e,f,g);    h+=t1;    d=t1+t2;
  	t1 = c + e1(h) + Ch(h,a,b) + 0x4a7484aa + W[21];
  	t2 = e0(d) + Maj(d,e,f);    g+=t1;    c=t1+t2;
  	t1 = b + e1(g) + Ch(g,h,a) + 0x5cb0a9dc + W[22];
  	t2 = e0(c) + Maj(c,d,e);    f+=t1;    b=t1+t2;
  	t1 = a + e1(f) + Ch(f,g,h) + 0x76f988da + W[23];
  	t2 = e0(b) + Maj(b,c,d);    e+=t1;    a=t1+t2;
  
  	t1 = h + e1(e) + Ch(e,f,g) + 0x983e5152 + W[24];
  	t2 = e0(a) + Maj(a,b,c);    d+=t1;    h=t1+t2;
  	t1 = g + e1(d) + Ch(d,e,f) + 0xa831c66d + W[25];
  	t2 = e0(h) + Maj(h,a,b);    c+=t1;    g=t1+t2;
  	t1 = f + e1(c) + Ch(c,d,e) + 0xb00327c8 + W[26];
  	t2 = e0(g) + Maj(g,h,a);    b+=t1;    f=t1+t2;
  	t1 = e + e1(b) + Ch(b,c,d) + 0xbf597fc7 + W[27];
  	t2 = e0(f) + Maj(f,g,h);    a+=t1;    e=t1+t2;
  	t1 = d + e1(a) + Ch(a,b,c) + 0xc6e00bf3 + W[28];
  	t2 = e0(e) + Maj(e,f,g);    h+=t1;    d=t1+t2;
  	t1 = c + e1(h) + Ch(h,a,b) + 0xd5a79147 + W[29];
  	t2 = e0(d) + Maj(d,e,f);    g+=t1;    c=t1+t2;
  	t1 = b + e1(g) + Ch(g,h,a) + 0x06ca6351 + W[30];
  	t2 = e0(c) + Maj(c,d,e);    f+=t1;    b=t1+t2;
  	t1 = a + e1(f) + Ch(f,g,h) + 0x14292967 + W[31];
  	t2 = e0(b) + Maj(b,c,d);    e+=t1;    a=t1+t2;
  
  	t1 = h + e1(e) + Ch(e,f,g) + 0x27b70a85 + W[32];
  	t2 = e0(a) + Maj(a,b,c);    d+=t1;    h=t1+t2;
  	t1 = g + e1(d) + Ch(d,e,f) + 0x2e1b2138 + W[33];
  	t2 = e0(h) + Maj(h,a,b);    c+=t1;    g=t1+t2;
  	t1 = f + e1(c) + Ch(c,d,e) + 0x4d2c6dfc + W[34];
  	t2 = e0(g) + Maj(g,h,a);    b+=t1;    f=t1+t2;
  	t1 = e + e1(b) + Ch(b,c,d) + 0x53380d13 + W[35];
  	t2 = e0(f) + Maj(f,g,h);    a+=t1;    e=t1+t2;
  	t1 = d + e1(a) + Ch(a,b,c) + 0x650a7354 + W[36];
  	t2 = e0(e) + Maj(e,f,g);    h+=t1;    d=t1+t2;
  	t1 = c + e1(h) + Ch(h,a,b) + 0x766a0abb + W[37];
  	t2 = e0(d) + Maj(d,e,f);    g+=t1;    c=t1+t2;
  	t1 = b + e1(g) + Ch(g,h,a) + 0x81c2c92e + W[38];
  	t2 = e0(c) + Maj(c,d,e);    f+=t1;    b=t1+t2;
  	t1 = a + e1(f) + Ch(f,g,h) + 0x92722c85 + W[39];
  	t2 = e0(b) + Maj(b,c,d);    e+=t1;    a=t1+t2;
  
  	t1 = h + e1(e) + Ch(e,f,g) + 0xa2bfe8a1 + W[40];
  	t2 = e0(a) + Maj(a,b,c);    d+=t1;    h=t1+t2;
  	t1 = g + e1(d) + Ch(d,e,f) + 0xa81a664b + W[41];
  	t2 = e0(h) + Maj(h,a,b);    c+=t1;    g=t1+t2;
  	t1 = f + e1(c) + Ch(c,d,e) + 0xc24b8b70 + W[42];
  	t2 = e0(g) + Maj(g,h,a);    b+=t1;    f=t1+t2;
  	t1 = e + e1(b) + Ch(b,c,d) + 0xc76c51a3 + W[43];
  	t2 = e0(f) + Maj(f,g,h);    a+=t1;    e=t1+t2;
  	t1 = d + e1(a) + Ch(a,b,c) + 0xd192e819 + W[44];
  	t2 = e0(e) + Maj(e,f,g);    h+=t1;    d=t1+t2;
  	t1 = c + e1(h) + Ch(h,a,b) + 0xd6990624 + W[45];
  	t2 = e0(d) + Maj(d,e,f);    g+=t1;    c=t1+t2;
  	t1 = b + e1(g) + Ch(g,h,a) + 0xf40e3585 + W[46];
  	t2 = e0(c) + Maj(c,d,e);    f+=t1;    b=t1+t2;
  	t1 = a + e1(f) + Ch(f,g,h) + 0x106aa070 + W[47];
  	t2 = e0(b) + Maj(b,c,d);    e+=t1;    a=t1+t2;
  
  	t1 = h + e1(e) + Ch(e,f,g) + 0x19a4c116 + W[48];
  	t2 = e0(a) + Maj(a,b,c);    d+=t1;    h=t1+t2;
  	t1 = g + e1(d) + Ch(d,e,f) + 0x1e376c08 + W[49];
  	t2 = e0(h) + Maj(h,a,b);    c+=t1;    g=t1+t2;
  	t1 = f + e1(c) + Ch(c,d,e) + 0x2748774c + W[50];
  	t2 = e0(g) + Maj(g,h,a);    b+=t1;    f=t1+t2;
  	t1 = e + e1(b) + Ch(b,c,d) + 0x34b0bcb5 + W[51];
  	t2 = e0(f) + Maj(f,g,h);    a+=t1;    e=t1+t2;
  	t1 = d + e1(a) + Ch(a,b,c) + 0x391c0cb3 + W[52];
  	t2 = e0(e) + Maj(e,f,g);    h+=t1;    d=t1+t2;
  	t1 = c + e1(h) + Ch(h,a,b) + 0x4ed8aa4a + W[53];
  	t2 = e0(d) + Maj(d,e,f);    g+=t1;    c=t1+t2;
  	t1 = b + e1(g) + Ch(g,h,a) + 0x5b9cca4f + W[54];
  	t2 = e0(c) + Maj(c,d,e);    f+=t1;    b=t1+t2;
  	t1 = a + e1(f) + Ch(f,g,h) + 0x682e6ff3 + W[55];
  	t2 = e0(b) + Maj(b,c,d);    e+=t1;    a=t1+t2;
  
  	t1 = h + e1(e) + Ch(e,f,g) + 0x748f82ee + W[56];
  	t2 = e0(a) + Maj(a,b,c);    d+=t1;    h=t1+t2;
  	t1 = g + e1(d) + Ch(d,e,f) + 0x78a5636f + W[57];
  	t2 = e0(h) + Maj(h,a,b);    c+=t1;    g=t1+t2;
  	t1 = f + e1(c) + Ch(c,d,e) + 0x84c87814 + W[58];
  	t2 = e0(g) + Maj(g,h,a);    b+=t1;    f=t1+t2;
  	t1 = e + e1(b) + Ch(b,c,d) + 0x8cc70208 + W[59];
  	t2 = e0(f) + Maj(f,g,h);    a+=t1;    e=t1+t2;
  	t1 = d + e1(a) + Ch(a,b,c) + 0x90befffa + W[60];
  	t2 = e0(e) + Maj(e,f,g);    h+=t1;    d=t1+t2;
  	t1 = c + e1(h) + Ch(h,a,b) + 0xa4506ceb + W[61];
  	t2 = e0(d) + Maj(d,e,f);    g+=t1;    c=t1+t2;
  	t1 = b + e1(g) + Ch(g,h,a) + 0xbef9a3f7 + W[62];
  	t2 = e0(c) + Maj(c,d,e);    f+=t1;    b=t1+t2;
  	t1 = a + e1(f) + Ch(f,g,h) + 0xc67178f2 + W[63];
  	t2 = e0(b) + Maj(b,c,d);    e+=t1;    a=t1+t2;
  
  	state[0] += a; state[1] += b; state[2] += c; state[3] += d;
  	state[4] += e; state[5] += f; state[6] += g; state[7] += h;
  
  	/* clear any sensitive info... */
  	a = b = c = d = e = f = g = h = t1 = t2 = 0;
7185ad267   Daniel Borkmann   crypto: memzero_e...
224
  	memzero_explicit(W, 64 * sizeof(u32));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
225
  }
a2e5ba4fe   Ard Biesheuvel   crypto: sha256-ge...
226
227
  static void sha256_generic_block_fn(struct sha256_state *sst, u8 const *src,
  				    int blocks)
cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
228
  {
a2e5ba4fe   Ard Biesheuvel   crypto: sha256-ge...
229
230
231
232
  	while (blocks--) {
  		sha256_transform(sst->state, src);
  		src += SHA256_BLOCK_SIZE;
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
233
  }
35d2c9d0c   Tim Chen   crypto: sha256 - ...
234
  int crypto_sha256_update(struct shash_desc *desc, const u8 *data,
6c2bb98bc   Herbert Xu   [CRYPTO] all: Pas...
235
  			  unsigned int len)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
236
  {
a2e5ba4fe   Ard Biesheuvel   crypto: sha256-ge...
237
  	return sha256_base_do_update(desc, data, len, sha256_generic_block_fn);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
238
  }
35d2c9d0c   Tim Chen   crypto: sha256 - ...
239
  EXPORT_SYMBOL(crypto_sha256_update);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
240

50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
241
  static int sha256_final(struct shash_desc *desc, u8 *out)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
242
  {
a2e5ba4fe   Ard Biesheuvel   crypto: sha256-ge...
243
244
  	sha256_base_do_finalize(desc, sha256_generic_block_fn);
  	return sha256_base_finish(desc, out);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
245
  }
a2e5ba4fe   Ard Biesheuvel   crypto: sha256-ge...
246
247
  int crypto_sha256_finup(struct shash_desc *desc, const u8 *data,
  			unsigned int len, u8 *hash)
cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
248
  {
a2e5ba4fe   Ard Biesheuvel   crypto: sha256-ge...
249
250
  	sha256_base_do_update(desc, data, len, sha256_generic_block_fn);
  	return sha256_final(desc, hash);
9b2fda7b9   Herbert Xu   crypto: sha256_ge...
251
  }
a2e5ba4fe   Ard Biesheuvel   crypto: sha256-ge...
252
  EXPORT_SYMBOL(crypto_sha256_finup);
9b2fda7b9   Herbert Xu   crypto: sha256_ge...
253

6aeb49bc5   Jussi Kivilinna   crypto: sha256 - ...
254
  static struct shash_alg sha256_algs[2] = { {
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
255
  	.digestsize	=	SHA256_DIGEST_SIZE,
a2e5ba4fe   Ard Biesheuvel   crypto: sha256-ge...
256
  	.init		=	sha256_base_init,
35d2c9d0c   Tim Chen   crypto: sha256 - ...
257
  	.update		=	crypto_sha256_update,
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
258
  	.final		=	sha256_final,
a2e5ba4fe   Ard Biesheuvel   crypto: sha256-ge...
259
  	.finup		=	crypto_sha256_finup,
9b2fda7b9   Herbert Xu   crypto: sha256_ge...
260
  	.descsize	=	sizeof(struct sha256_state),
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
261
262
263
  	.base		=	{
  		.cra_name	=	"sha256",
  		.cra_driver_name=	"sha256-generic",
b73b7ac0a   Eric Biggers   crypto: sha256_ge...
264
  		.cra_priority	=	100,
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
265
266
267
  		.cra_blocksize	=	SHA256_BLOCK_SIZE,
  		.cra_module	=	THIS_MODULE,
  	}
6aeb49bc5   Jussi Kivilinna   crypto: sha256 - ...
268
  }, {
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
269
  	.digestsize	=	SHA224_DIGEST_SIZE,
a2e5ba4fe   Ard Biesheuvel   crypto: sha256-ge...
270
  	.init		=	sha224_base_init,
35d2c9d0c   Tim Chen   crypto: sha256 - ...
271
  	.update		=	crypto_sha256_update,
a2e5ba4fe   Ard Biesheuvel   crypto: sha256-ge...
272
273
  	.final		=	sha256_final,
  	.finup		=	crypto_sha256_finup,
9b2fda7b9   Herbert Xu   crypto: sha256_ge...
274
  	.descsize	=	sizeof(struct sha256_state),
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
275
276
277
  	.base		=	{
  		.cra_name	=	"sha224",
  		.cra_driver_name=	"sha224-generic",
b73b7ac0a   Eric Biggers   crypto: sha256_ge...
278
  		.cra_priority	=	100,
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
279
280
281
  		.cra_blocksize	=	SHA224_BLOCK_SIZE,
  		.cra_module	=	THIS_MODULE,
  	}
6aeb49bc5   Jussi Kivilinna   crypto: sha256 - ...
282
  } };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
283

3af5b90bd   Kamalesh Babulal   [CRYPTO] all: Cle...
284
  static int __init sha256_generic_mod_init(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
285
  {
6aeb49bc5   Jussi Kivilinna   crypto: sha256 - ...
286
  	return crypto_register_shashes(sha256_algs, ARRAY_SIZE(sha256_algs));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
287
  }
3af5b90bd   Kamalesh Babulal   [CRYPTO] all: Cle...
288
  static void __exit sha256_generic_mod_fini(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
289
  {
6aeb49bc5   Jussi Kivilinna   crypto: sha256 - ...
290
  	crypto_unregister_shashes(sha256_algs, ARRAY_SIZE(sha256_algs));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
291
  }
c4741b230   Eric Biggers   crypto: run initc...
292
  subsys_initcall(sha256_generic_mod_init);
3af5b90bd   Kamalesh Babulal   [CRYPTO] all: Cle...
293
  module_exit(sha256_generic_mod_fini);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
294
295
  
  MODULE_LICENSE("GPL");
cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
296
  MODULE_DESCRIPTION("SHA-224 and SHA-256 Secure Hash Algorithm");
b3be9a6d9   Michal Ludvig   [CRYPTO] sha: Add...
297

5d26a105b   Kees Cook   crypto: prefix mo...
298
  MODULE_ALIAS_CRYPTO("sha224");
3e14dcf7c   Mathias Krause   crypto: add missi...
299
  MODULE_ALIAS_CRYPTO("sha224-generic");
5d26a105b   Kees Cook   crypto: prefix mo...
300
  MODULE_ALIAS_CRYPTO("sha256");
3e14dcf7c   Mathias Krause   crypto: add missi...
301
  MODULE_ALIAS_CRYPTO("sha256-generic");