diff options
Diffstat (limited to 'crypto/sha512.c')
| -rw-r--r-- | crypto/sha512.c | 54 |
1 files changed, 12 insertions, 42 deletions
diff --git a/crypto/sha512.c b/crypto/sha512.c index c663438322e9..3e6e9392310c 100644 --- a/crypto/sha512.c +++ b/crypto/sha512.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | #include <linux/mm.h> | 17 | #include <linux/mm.h> |
| 18 | #include <linux/init.h> | 18 | #include <linux/init.h> |
| 19 | #include <linux/crypto.h> | 19 | #include <linux/crypto.h> |
| 20 | #include <linux/types.h> | ||
| 20 | 21 | ||
| 21 | #include <asm/scatterlist.h> | 22 | #include <asm/scatterlist.h> |
| 22 | #include <asm/byteorder.h> | 23 | #include <asm/byteorder.h> |
| @@ -235,39 +236,17 @@ static void | |||
| 235 | sha512_final(void *ctx, u8 *hash) | 236 | sha512_final(void *ctx, u8 *hash) |
| 236 | { | 237 | { |
| 237 | struct sha512_ctx *sctx = ctx; | 238 | struct sha512_ctx *sctx = ctx; |
| 238 | |||
| 239 | static u8 padding[128] = { 0x80, }; | 239 | static u8 padding[128] = { 0x80, }; |
| 240 | 240 | __be64 *dst = (__be64 *)hash; | |
| 241 | u32 t; | 241 | __be32 bits[4]; |
| 242 | u64 t2; | ||
| 243 | u8 bits[128]; | ||
| 244 | unsigned int index, pad_len; | 242 | unsigned int index, pad_len; |
| 245 | int i, j; | 243 | int i; |
| 246 | |||
| 247 | index = pad_len = t = i = j = 0; | ||
| 248 | t2 = 0; | ||
| 249 | 244 | ||
| 250 | /* Save number of bits */ | 245 | /* Save number of bits */ |
| 251 | t = sctx->count[0]; | 246 | bits[3] = cpu_to_be32(sctx->count[0]); |
| 252 | bits[15] = t; t>>=8; | 247 | bits[2] = cpu_to_be32(sctx->count[1]); |
| 253 | bits[14] = t; t>>=8; | 248 | bits[1] = cpu_to_be32(sctx->count[2]); |
| 254 | bits[13] = t; t>>=8; | 249 | bits[0] = cpu_to_be32(sctx->count[3]); |
| 255 | bits[12] = t; | ||
| 256 | t = sctx->count[1]; | ||
| 257 | bits[11] = t; t>>=8; | ||
| 258 | bits[10] = t; t>>=8; | ||
| 259 | bits[9 ] = t; t>>=8; | ||
| 260 | bits[8 ] = t; | ||
| 261 | t = sctx->count[2]; | ||
| 262 | bits[7 ] = t; t>>=8; | ||
| 263 | bits[6 ] = t; t>>=8; | ||
| 264 | bits[5 ] = t; t>>=8; | ||
| 265 | bits[4 ] = t; | ||
| 266 | t = sctx->count[3]; | ||
| 267 | bits[3 ] = t; t>>=8; | ||
| 268 | bits[2 ] = t; t>>=8; | ||
| 269 | bits[1 ] = t; t>>=8; | ||
| 270 | bits[0 ] = t; | ||
| 271 | 250 | ||
| 272 | /* Pad out to 112 mod 128. */ | 251 | /* Pad out to 112 mod 128. */ |
| 273 | index = (sctx->count[0] >> 3) & 0x7f; | 252 | index = (sctx->count[0] >> 3) & 0x7f; |
| @@ -275,21 +254,12 @@ sha512_final(void *ctx, u8 *hash) | |||
| 275 | sha512_update(sctx, padding, pad_len); | 254 | sha512_update(sctx, padding, pad_len); |
| 276 | 255 | ||
| 277 | /* Append length (before padding) */ | 256 | /* Append length (before padding) */ |
| 278 | sha512_update(sctx, bits, 16); | 257 | sha512_update(sctx, (const u8 *)bits, sizeof(bits)); |
| 279 | 258 | ||
| 280 | /* Store state in digest */ | 259 | /* Store state in digest */ |
| 281 | for (i = j = 0; i < 8; i++, j += 8) { | 260 | for (i = 0; i < 8; i++) |
| 282 | t2 = sctx->state[i]; | 261 | dst[i] = cpu_to_be64(sctx->state[i]); |
| 283 | hash[j+7] = (char)t2 & 0xff; t2>>=8; | 262 | |
| 284 | hash[j+6] = (char)t2 & 0xff; t2>>=8; | ||
| 285 | hash[j+5] = (char)t2 & 0xff; t2>>=8; | ||
| 286 | hash[j+4] = (char)t2 & 0xff; t2>>=8; | ||
| 287 | hash[j+3] = (char)t2 & 0xff; t2>>=8; | ||
| 288 | hash[j+2] = (char)t2 & 0xff; t2>>=8; | ||
| 289 | hash[j+1] = (char)t2 & 0xff; t2>>=8; | ||
| 290 | hash[j ] = (char)t2 & 0xff; | ||
| 291 | } | ||
| 292 | |||
| 293 | /* Zeroize sensitive information. */ | 263 | /* Zeroize sensitive information. */ |
| 294 | memset(sctx, 0, sizeof(struct sha512_ctx)); | 264 | memset(sctx, 0, sizeof(struct sha512_ctx)); |
| 295 | } | 265 | } |
