Merge to Fedora kernel-2.6.18-1.2224_FC5 patched with stable patch-2.6.18.1-vs2.0...
[linux-2.6.git] / crypto / sha256.c
index 39f5a65..bc71d85 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/module.h>
 #include <linux/mm.h>
 #include <linux/crypto.h>
+#include <linux/types.h>
 #include <asm/scatterlist.h>
 #include <asm/byteorder.h>
 
@@ -42,15 +43,10 @@ static inline u32 Maj(u32 x, u32 y, u32 z)
        return (x & y) | (z & (x | y));
 }
 
-static inline u32 RORu32(u32 x, u32 y)
-{
-       return (x >> y) | (x << (32 - y));
-}
-
-#define e0(x)       (RORu32(x, 2) ^ RORu32(x,13) ^ RORu32(x,22))
-#define e1(x)       (RORu32(x, 6) ^ RORu32(x,11) ^ RORu32(x,25))
-#define s0(x)       (RORu32(x, 7) ^ RORu32(x,18) ^ (x >> 3))
-#define s1(x)       (RORu32(x,17) ^ RORu32(x,19) ^ (x >> 10))
+#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))
 
 #define H0         0x6a09e667
 #define H1         0xbb67ae85
@@ -63,7 +59,7 @@ static inline u32 RORu32(u32 x, u32 y)
 
 static inline void LOAD_OP(int I, u32 *W, const u8 *input)
 {
-       W[I] = __be32_to_cpu( ((u32*)(input))[I] );
+       W[I] = __be32_to_cpu( ((__be32*)(input))[I] );
 }
 
 static inline void BLEND_OP(int I, u32 *W)
@@ -234,9 +230,9 @@ static void sha256_transform(u32 *state, const u8 *input)
        memset(W, 0, 64 * sizeof(u32));
 }
 
-static void sha256_init(void *ctx)
+static void sha256_init(struct crypto_tfm *tfm)
 {
-       struct sha256_ctx *sctx = ctx;
+       struct sha256_ctx *sctx = crypto_tfm_ctx(tfm);
        sctx->state[0] = H0;
        sctx->state[1] = H1;
        sctx->state[2] = H2;
@@ -246,12 +242,12 @@ static void sha256_init(void *ctx)
        sctx->state[6] = H6;
        sctx->state[7] = H7;
        sctx->count[0] = sctx->count[1] = 0;
-       memset(sctx->buf, 0, sizeof(sctx->buf));
 }
 
-static void sha256_update(void *ctx, const u8 *data, unsigned int len)
+static void sha256_update(struct crypto_tfm *tfm, const u8 *data,
+                         unsigned int len)
 {
-       struct sha256_ctx *sctx = ctx;
+       struct sha256_ctx *sctx = crypto_tfm_ctx(tfm);
        unsigned int i, index, part_len;
 
        /* Compute number of bytes mod 128 */
@@ -281,42 +277,30 @@ static void sha256_update(void *ctx, const u8 *data, unsigned int len)
        memcpy(&sctx->buf[index], &data[i], len-i);
 }
 
-static void sha256_final(void* ctx, u8 *out)
+static void sha256_final(struct crypto_tfm *tfm, u8 *out)
 {
-       struct sha256_ctx *sctx = ctx;
-       u8 bits[8];
-       unsigned int index, pad_len, t;
-       int i, j;
+       struct sha256_ctx *sctx = crypto_tfm_ctx(tfm);
+       __be32 *dst = (__be32 *)out;
+       __be32 bits[2];
+       unsigned int index, pad_len;
+       int i;
        static const u8 padding[64] = { 0x80, };
 
        /* Save number of bits */
-       t = sctx->count[0];
-       bits[7] = t; t >>= 8;
-       bits[6] = t; t >>= 8;
-       bits[5] = t; t >>= 8;
-       bits[4] = t;
-       t = sctx->count[1];
-       bits[3] = t; t >>= 8;
-       bits[2] = t; t >>= 8;
-       bits[1] = t; t >>= 8;
-       bits[0] = t;
+       bits[1] = cpu_to_be32(sctx->count[0]);
+       bits[0] = cpu_to_be32(sctx->count[1]);
 
        /* Pad out to 56 mod 64. */
        index = (sctx->count[0] >> 3) & 0x3f;
        pad_len = (index < 56) ? (56 - index) : ((64+56) - index);
-       sha256_update(sctx, padding, pad_len);
+       sha256_update(tfm, padding, pad_len);
 
        /* Append length (before padding) */
-       sha256_update(sctx, bits, 8);
+       sha256_update(tfm, (const u8 *)bits, sizeof(bits));
 
        /* Store state in digest */
-       for (i = j = 0; i < 8; i++, j += 4) {
-               t = sctx->state[i];
-               out[j+3] = t; t >>= 8;
-               out[j+2] = t; t >>= 8;
-               out[j+1] = t; t >>= 8;
-               out[j  ] = t;
-       }
+       for (i = 0; i < 8; i++)
+               dst[i] = cpu_to_be32(sctx->state[i]);
 
        /* Zeroize sensitive information. */
        memset(sctx, 0, sizeof(*sctx));
@@ -329,6 +313,7 @@ static struct crypto_alg alg = {
        .cra_blocksize  =       SHA256_HMAC_BLOCK_SIZE,
        .cra_ctxsize    =       sizeof(struct sha256_ctx),
        .cra_module     =       THIS_MODULE,
+       .cra_alignmask  =       3,
        .cra_list       =       LIST_HEAD_INIT(alg.cra_list),
        .cra_u          =       { .digest = {
        .dia_digestsize =       SHA256_DIGEST_SIZE,