Blame view

crypto/sha256_generic.c 12.2 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
  /*
   * Cryptographic API.
   *
   * SHA-256, as specified in
   * http://csrc.nist.gov/cryptval/shs/sha256-384-512.pdf
   *
   * 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
20
21
22
23
   *
   * 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.
   *
   */
  #include <linux/init.h>
  #include <linux/module.h>
  #include <linux/mm.h>
  #include <linux/crypto.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
41
42
43
44
45
46
  struct sha256_ctx {
  	u32 count[2];
  	u32 state[8];
  	u8 buf[128];
  };
  
  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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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
213
214
215
216
217
218
  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);
      
  	/* 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...
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
  
  static void sha224_init(struct crypto_tfm *tfm)
  {
  	struct sha256_ctx *sctx = crypto_tfm_ctx(tfm);
  	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;
  	sctx->count[0] = 0;
  	sctx->count[1] = 0;
  }
6c2bb98bc   Herbert Xu   [CRYPTO] all: Pas...
234
  static void sha256_init(struct crypto_tfm *tfm)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
235
  {
6c2bb98bc   Herbert Xu   [CRYPTO] all: Pas...
236
  	struct sha256_ctx *sctx = crypto_tfm_ctx(tfm);
5265eeb2b   Jan Glauber   [CRYPTO] sha: Add...
237
238
239
240
241
242
243
244
  	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;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
245
  	sctx->count[0] = sctx->count[1] = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
246
  }
6c2bb98bc   Herbert Xu   [CRYPTO] all: Pas...
247
248
  static void sha256_update(struct crypto_tfm *tfm, const u8 *data,
  			  unsigned int len)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
249
  {
6c2bb98bc   Herbert Xu   [CRYPTO] all: Pas...
250
  	struct sha256_ctx *sctx = crypto_tfm_ctx(tfm);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
  	unsigned int i, index, part_len;
  
  	/* Compute number of bytes mod 128 */
  	index = (unsigned int)((sctx->count[0] >> 3) & 0x3f);
  
  	/* Update number of bits */
  	if ((sctx->count[0] += (len << 3)) < (len << 3)) {
  		sctx->count[1]++;
  		sctx->count[1] += (len >> 29);
  	}
  
  	part_len = 64 - index;
  
  	/* Transform as many times as possible. */
  	if (len >= part_len) {
  		memcpy(&sctx->buf[index], data, part_len);
  		sha256_transform(sctx->state, sctx->buf);
  
  		for (i = part_len; i + 63 < len; i += 64)
  			sha256_transform(sctx->state, &data[i]);
  		index = 0;
  	} else {
  		i = 0;
  	}
  	
  	/* Buffer remaining input */
  	memcpy(&sctx->buf[index], &data[i], len-i);
  }
6c2bb98bc   Herbert Xu   [CRYPTO] all: Pas...
279
  static void sha256_final(struct crypto_tfm *tfm, u8 *out)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
280
  {
6c2bb98bc   Herbert Xu   [CRYPTO] all: Pas...
281
  	struct sha256_ctx *sctx = crypto_tfm_ctx(tfm);
06ace7a9b   Herbert Xu   [CRYPTO] Use stan...
282
283
284
285
  	__be32 *dst = (__be32 *)out;
  	__be32 bits[2];
  	unsigned int index, pad_len;
  	int i;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
286
287
288
  	static const u8 padding[64] = { 0x80, };
  
  	/* Save number of bits */
06ace7a9b   Herbert Xu   [CRYPTO] Use stan...
289
290
  	bits[1] = cpu_to_be32(sctx->count[0]);
  	bits[0] = cpu_to_be32(sctx->count[1]);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
291
292
293
294
  
  	/* Pad out to 56 mod 64. */
  	index = (sctx->count[0] >> 3) & 0x3f;
  	pad_len = (index < 56) ? (56 - index) : ((64+56) - index);
6c2bb98bc   Herbert Xu   [CRYPTO] all: Pas...
295
  	sha256_update(tfm, padding, pad_len);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
296
297
  
  	/* Append length (before padding) */
6c2bb98bc   Herbert Xu   [CRYPTO] all: Pas...
298
  	sha256_update(tfm, (const u8 *)bits, sizeof(bits));
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
299
300
  
  	/* Store state in digest */
06ace7a9b   Herbert Xu   [CRYPTO] Use stan...
301
302
  	for (i = 0; i < 8; i++)
  		dst[i] = cpu_to_be32(sctx->state[i]);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
303
304
305
306
  
  	/* Zeroize sensitive information. */
  	memset(sctx, 0, sizeof(*sctx));
  }
cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
307
308
309
310
311
312
313
314
315
  static void sha224_final(struct crypto_tfm *tfm, u8 *hash)
  {
  	u8 D[SHA256_DIGEST_SIZE];
  
  	sha256_final(tfm, D);
  
  	memcpy(hash, D, SHA224_DIGEST_SIZE);
  	memset(D, 0, SHA256_DIGEST_SIZE);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
316

cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
317
  static struct crypto_alg sha256 = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
318
  	.cra_name	=	"sha256",
b3be9a6d9   Michal Ludvig   [CRYPTO] sha: Add...
319
  	.cra_driver_name=	"sha256-generic",
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
320
  	.cra_flags	=	CRYPTO_ALG_TYPE_DIGEST,
5265eeb2b   Jan Glauber   [CRYPTO] sha: Add...
321
  	.cra_blocksize	=	SHA256_BLOCK_SIZE,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
322
323
  	.cra_ctxsize	=	sizeof(struct sha256_ctx),
  	.cra_module	=	THIS_MODULE,
e1147d8f4   Atsushi Nemoto   [CRYPTO] digest: ...
324
  	.cra_alignmask	=	3,
cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
325
  	.cra_list	=	LIST_HEAD_INIT(sha256.cra_list),
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
326
327
  	.cra_u		=	{ .digest = {
  	.dia_digestsize	=	SHA256_DIGEST_SIZE,
cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
  	.dia_init	=	sha256_init,
  	.dia_update	=	sha256_update,
  	.dia_final	=	sha256_final } }
  };
  
  static struct crypto_alg sha224 = {
  	.cra_name	= "sha224",
  	.cra_driver_name = "sha224-generic",
  	.cra_flags	= CRYPTO_ALG_TYPE_DIGEST,
  	.cra_blocksize	= SHA224_BLOCK_SIZE,
  	.cra_ctxsize	= sizeof(struct sha256_ctx),
  	.cra_module	= THIS_MODULE,
  	.cra_alignmask	= 3,
  	.cra_list	= LIST_HEAD_INIT(sha224.cra_list),
  	.cra_u		= { .digest = {
  	.dia_digestsize = SHA224_DIGEST_SIZE,
  	.dia_init	= sha224_init,
  	.dia_update	= sha256_update,
  	.dia_final	= sha224_final } }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
347
  };
3af5b90bd   Kamalesh Babulal   [CRYPTO] all: Cle...
348
  static int __init sha256_generic_mod_init(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
349
  {
cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
350
351
352
353
354
355
356
357
358
359
360
361
362
  	int ret = 0;
  
  	ret = crypto_register_alg(&sha224);
  
  	if (ret < 0)
  		return ret;
  
  	ret = crypto_register_alg(&sha256);
  
  	if (ret < 0)
  		crypto_unregister_alg(&sha224);
  
  	return ret;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
363
  }
3af5b90bd   Kamalesh Babulal   [CRYPTO] all: Cle...
364
  static void __exit sha256_generic_mod_fini(void)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
365
  {
cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
366
367
  	crypto_unregister_alg(&sha224);
  	crypto_unregister_alg(&sha256);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
368
  }
3af5b90bd   Kamalesh Babulal   [CRYPTO] all: Cle...
369
370
  module_init(sha256_generic_mod_init);
  module_exit(sha256_generic_mod_fini);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
371
372
  
  MODULE_LICENSE("GPL");
cd12fb906   Jonathan Lynch   [CRYPTO] sha256-g...
373
  MODULE_DESCRIPTION("SHA-224 and SHA-256 Secure Hash Algorithm");
b3be9a6d9   Michal Ludvig   [CRYPTO] sha: Add...
374

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