Blame view

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

9b2fda7b9   Herbert Xu   crypto: sha256_ge...
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
  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;
  }
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
330
331
332
333
334
  static struct shash_alg sha256 = {
  	.digestsize	=	SHA256_DIGEST_SIZE,
  	.init		=	sha256_init,
  	.update		=	sha256_update,
  	.final		=	sha256_final,
9b2fda7b9   Herbert Xu   crypto: sha256_ge...
335
336
337
338
  	.export		=	sha256_export,
  	.import		=	sha256_import,
  	.descsize	=	sizeof(struct sha256_state),
  	.statesize	=	sizeof(struct sha256_state),
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
339
340
341
342
343
344
345
  	.base		=	{
  		.cra_name	=	"sha256",
  		.cra_driver_name=	"sha256-generic",
  		.cra_flags	=	CRYPTO_ALG_TYPE_SHASH,
  		.cra_blocksize	=	SHA256_BLOCK_SIZE,
  		.cra_module	=	THIS_MODULE,
  	}
cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
346
  };
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
347
348
349
350
351
  static struct shash_alg sha224 = {
  	.digestsize	=	SHA224_DIGEST_SIZE,
  	.init		=	sha224_init,
  	.update		=	sha256_update,
  	.final		=	sha224_final,
9b2fda7b9   Herbert Xu   crypto: sha256_ge...
352
  	.descsize	=	sizeof(struct sha256_state),
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
353
354
355
356
357
358
359
  	.base		=	{
  		.cra_name	=	"sha224",
  		.cra_driver_name=	"sha224-generic",
  		.cra_flags	=	CRYPTO_ALG_TYPE_SHASH,
  		.cra_blocksize	=	SHA224_BLOCK_SIZE,
  		.cra_module	=	THIS_MODULE,
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
360
  };
3af5b90bd   Kamalesh Babulal   [CRYPTO] all: Cle...
361
  static int __init sha256_generic_mod_init(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
362
  {
cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
363
  	int ret = 0;
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
364
  	ret = crypto_register_shash(&sha224);
cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
365
366
367
  
  	if (ret < 0)
  		return ret;
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
368
  	ret = crypto_register_shash(&sha256);
cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
369
370
  
  	if (ret < 0)
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
371
  		crypto_unregister_shash(&sha224);
cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
372
373
  
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
374
  }
3af5b90bd   Kamalesh Babulal   [CRYPTO] all: Cle...
375
  static void __exit sha256_generic_mod_fini(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
376
  {
50e109b5b   Adrian-Ken Rueegsegger   crypto: sha256 - ...
377
378
  	crypto_unregister_shash(&sha224);
  	crypto_unregister_shash(&sha256);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
379
  }
3af5b90bd   Kamalesh Babulal   [CRYPTO] all: Cle...
380
381
  module_init(sha256_generic_mod_init);
  module_exit(sha256_generic_mod_fini);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
382
383
  
  MODULE_LICENSE("GPL");
cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
384
  MODULE_DESCRIPTION("SHA-224 and SHA-256 Secure Hash Algorithm");
b3be9a6d9   Michal Ludvig   [CRYPTO] sha: Add...
385

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