Blame view

crypto/sha256_generic.c 12.1 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
  /*
   * Cryptographic API.
   *
   * SHA-256, as specified in
8c882f641   Adrian-Ken Rueegsegger   crypto: Fix dead ...
5
   * http://csrc.nist.gov/groups/STM/cavp/documents/shs/sha256-384-512.pdf
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6
7
8
9
10
11
   *
   * 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...
12
   * SHA224 Support Copyright 2007 Intel Corporation <jonathan.lynch@intel.com>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
13
14
15
16
17
18
19
   *
   * This program is free software; you can redistribute it and/or modify it
   * under the terms of the GNU General Public License as published by the Free
   * Software Foundation; either version 2 of the License, or (at your option) 
   * any later version.
   *
   */
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
20
  #include <crypto/internal/hash.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
22
23
  #include <linux/init.h>
  #include <linux/module.h>
  #include <linux/mm.h>
06ace7a9b   Herbert Xu   [CRYPTO] Use stan...
24
  #include <linux/types.h>
5265eeb2b   Jan Glauber   [CRYPTO] sha: Add...
25
  #include <crypto/sha.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
26
  #include <asm/byteorder.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
27
28
29
30
31
32
33
34
35
36
37
38
39
40
  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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
  static inline void LOAD_OP(int I, u32 *W, const u8 *input)
  {
  	W[I] = __be32_to_cpu( ((__be32*)(input))[I] );
  }
  
  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 - ...
64

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
65
66
67
68
69
70
71
72
73
74
75
76
77
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
  	/* 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;
  	memset(W, 0, 64 * sizeof(u32));
  }
cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
213

50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
214
  static int sha224_init(struct shash_desc *desc)
cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
215
  {
9b2fda7b9   Herbert Xu   crypto: sha256_ge...
216
  	struct sha256_state *sctx = shash_desc_ctx(desc);
cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
217
218
219
220
221
222
223
224
  	sctx->state[0] = SHA224_H0;
  	sctx->state[1] = SHA224_H1;
  	sctx->state[2] = SHA224_H2;
  	sctx->state[3] = SHA224_H3;
  	sctx->state[4] = SHA224_H4;
  	sctx->state[5] = SHA224_H5;
  	sctx->state[6] = SHA224_H6;
  	sctx->state[7] = SHA224_H7;
3d4d277cf   Herbert Xu   crypto: sha256_ge...
225
  	sctx->count = 0;
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
226
227
  
  	return 0;
cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
228
  }
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
229
  static int sha256_init(struct shash_desc *desc)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
230
  {
9b2fda7b9   Herbert Xu   crypto: sha256_ge...
231
  	struct sha256_state *sctx = shash_desc_ctx(desc);
5265eeb2b   Jan Glauber   [CRYPTO] sha: Add...
232
233
234
235
236
237
238
239
  	sctx->state[0] = SHA256_H0;
  	sctx->state[1] = SHA256_H1;
  	sctx->state[2] = SHA256_H2;
  	sctx->state[3] = SHA256_H3;
  	sctx->state[4] = SHA256_H4;
  	sctx->state[5] = SHA256_H5;
  	sctx->state[6] = SHA256_H6;
  	sctx->state[7] = SHA256_H7;
3d4d277cf   Herbert Xu   crypto: sha256_ge...
240
  	sctx->count = 0;
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
241
242
  
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
243
  }
35d2c9d0c   Tim Chen   crypto: sha256 - ...
244
  int crypto_sha256_update(struct shash_desc *desc, const u8 *data,
6c2bb98bc   Herbert Xu   [CRYPTO] all: Pas...
245
  			  unsigned int len)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
246
  {
9b2fda7b9   Herbert Xu   crypto: sha256_ge...
247
  	struct sha256_state *sctx = shash_desc_ctx(desc);
3d4d277cf   Herbert Xu   crypto: sha256_ge...
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
  	unsigned int partial, done;
  	const u8 *src;
  
  	partial = sctx->count & 0x3f;
  	sctx->count += len;
  	done = 0;
  	src = data;
  
  	if ((partial + len) > 63) {
  		if (partial) {
  			done = -partial;
  			memcpy(sctx->buf + partial, data, done + 64);
  			src = sctx->buf;
  		}
  
  		do {
  			sha256_transform(sctx->state, src);
  			done += 64;
  			src = data + done;
  		} while (done + 63 < len);
  
  		partial = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
270
  	}
3d4d277cf   Herbert Xu   crypto: sha256_ge...
271
  	memcpy(sctx->buf + partial, src, len - done);
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
272
273
  
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
274
  }
35d2c9d0c   Tim Chen   crypto: sha256 - ...
275
  EXPORT_SYMBOL(crypto_sha256_update);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
276

50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
277
  static int sha256_final(struct shash_desc *desc, u8 *out)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
278
  {
9b2fda7b9   Herbert Xu   crypto: sha256_ge...
279
  	struct sha256_state *sctx = shash_desc_ctx(desc);
06ace7a9b   Herbert Xu   [CRYPTO] Use stan...
280
  	__be32 *dst = (__be32 *)out;
3d4d277cf   Herbert Xu   crypto: sha256_ge...
281
  	__be64 bits;
06ace7a9b   Herbert Xu   [CRYPTO] Use stan...
282
283
  	unsigned int index, pad_len;
  	int i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
284
285
286
  	static const u8 padding[64] = { 0x80, };
  
  	/* Save number of bits */
3d4d277cf   Herbert Xu   crypto: sha256_ge...
287
  	bits = cpu_to_be64(sctx->count << 3);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
288
289
  
  	/* Pad out to 56 mod 64. */
3d4d277cf   Herbert Xu   crypto: sha256_ge...
290
  	index = sctx->count & 0x3f;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
291
  	pad_len = (index < 56) ? (56 - index) : ((64+56) - index);
35d2c9d0c   Tim Chen   crypto: sha256 - ...
292
  	crypto_sha256_update(desc, padding, pad_len);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
293
294
  
  	/* Append length (before padding) */
35d2c9d0c   Tim Chen   crypto: sha256 - ...
295
  	crypto_sha256_update(desc, (const u8 *)&bits, sizeof(bits));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
296
297
  
  	/* Store state in digest */
06ace7a9b   Herbert Xu   [CRYPTO] Use stan...
298
299
  	for (i = 0; i < 8; i++)
  		dst[i] = cpu_to_be32(sctx->state[i]);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
300
301
302
  
  	/* Zeroize sensitive information. */
  	memset(sctx, 0, sizeof(*sctx));
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
303
304
  
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
305
  }
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
306
  static int sha224_final(struct shash_desc *desc, u8 *hash)
cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
307
308
  {
  	u8 D[SHA256_DIGEST_SIZE];
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
309
  	sha256_final(desc, D);
cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
310
311
312
  
  	memcpy(hash, D, SHA224_DIGEST_SIZE);
  	memset(D, 0, SHA256_DIGEST_SIZE);
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
313
314
  
  	return 0;
cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
315
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
316

9b2fda7b9   Herbert Xu   crypto: sha256_ge...
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
  static int sha256_export(struct shash_desc *desc, void *out)
  {
  	struct sha256_state *sctx = shash_desc_ctx(desc);
  
  	memcpy(out, sctx, sizeof(*sctx));
  	return 0;
  }
  
  static int sha256_import(struct shash_desc *desc, const void *in)
  {
  	struct sha256_state *sctx = shash_desc_ctx(desc);
  
  	memcpy(sctx, in, sizeof(*sctx));
  	return 0;
  }
6aeb49bc5   Jussi Kivilinna   crypto: sha256 - ...
332
  static struct shash_alg sha256_algs[2] = { {
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
333
334
  	.digestsize	=	SHA256_DIGEST_SIZE,
  	.init		=	sha256_init,
35d2c9d0c   Tim Chen   crypto: sha256 - ...
335
  	.update		=	crypto_sha256_update,
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
336
  	.final		=	sha256_final,
9b2fda7b9   Herbert Xu   crypto: sha256_ge...
337
338
339
340
  	.export		=	sha256_export,
  	.import		=	sha256_import,
  	.descsize	=	sizeof(struct sha256_state),
  	.statesize	=	sizeof(struct sha256_state),
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
341
342
343
344
345
346
347
  	.base		=	{
  		.cra_name	=	"sha256",
  		.cra_driver_name=	"sha256-generic",
  		.cra_flags	=	CRYPTO_ALG_TYPE_SHASH,
  		.cra_blocksize	=	SHA256_BLOCK_SIZE,
  		.cra_module	=	THIS_MODULE,
  	}
6aeb49bc5   Jussi Kivilinna   crypto: sha256 - ...
348
  }, {
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
349
350
  	.digestsize	=	SHA224_DIGEST_SIZE,
  	.init		=	sha224_init,
35d2c9d0c   Tim Chen   crypto: sha256 - ...
351
  	.update		=	crypto_sha256_update,
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
352
  	.final		=	sha224_final,
9b2fda7b9   Herbert Xu   crypto: sha256_ge...
353
  	.descsize	=	sizeof(struct sha256_state),
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
354
355
356
357
358
359
360
  	.base		=	{
  		.cra_name	=	"sha224",
  		.cra_driver_name=	"sha224-generic",
  		.cra_flags	=	CRYPTO_ALG_TYPE_SHASH,
  		.cra_blocksize	=	SHA224_BLOCK_SIZE,
  		.cra_module	=	THIS_MODULE,
  	}
6aeb49bc5   Jussi Kivilinna   crypto: sha256 - ...
361
  } };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
362

3af5b90bd   Kamalesh Babulal   [CRYPTO] all: Cle...
363
  static int __init sha256_generic_mod_init(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
364
  {
6aeb49bc5   Jussi Kivilinna   crypto: sha256 - ...
365
  	return crypto_register_shashes(sha256_algs, ARRAY_SIZE(sha256_algs));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
366
  }
3af5b90bd   Kamalesh Babulal   [CRYPTO] all: Cle...
367
  static void __exit sha256_generic_mod_fini(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
368
  {
6aeb49bc5   Jussi Kivilinna   crypto: sha256 - ...
369
  	crypto_unregister_shashes(sha256_algs, ARRAY_SIZE(sha256_algs));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
370
  }
3af5b90bd   Kamalesh Babulal   [CRYPTO] all: Cle...
371
372
  module_init(sha256_generic_mod_init);
  module_exit(sha256_generic_mod_fini);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
373
374
  
  MODULE_LICENSE("GPL");
cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
375
  MODULE_DESCRIPTION("SHA-224 and SHA-256 Secure Hash Algorithm");
b3be9a6d9   Michal Ludvig   [CRYPTO] sha: Add...
376

cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
377
  MODULE_ALIAS("sha224");
ad5d27899   Sebastian Siewior   [CRYPTO] sha: Loa...
378
  MODULE_ALIAS("sha256");