Skip to content

Commit

Permalink
crypto: sha512 - Move message schedule W[80] to static percpu area
Browse files Browse the repository at this point in the history
The message schedule W (u64[80]) is too big for the stack. In order
for this algorithm to be used with shash it is moved to a static
percpu area.

Signed-off-by: Adrian-Ken Rueegsegger <[email protected]>
Signed-off-by: Herbert Xu <[email protected]>
  • Loading branch information
Kensan authored and herbertx committed Dec 25, 2008
1 parent 19e2bf1 commit f9e2bca
Showing 1 changed file with 9 additions and 8 deletions.
17 changes: 9 additions & 8 deletions crypto/sha512_generic.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,17 @@
#include <linux/crypto.h>
#include <linux/types.h>
#include <crypto/sha.h>

#include <linux/percpu.h>
#include <asm/byteorder.h>

struct sha512_ctx {
u64 state[8];
u32 count[4];
u8 buf[128];
u64 W[80];
};

static DEFINE_PER_CPU(u64[80], msg_schedule);

static inline u64 Ch(u64 x, u64 y, u64 z)
{
return z ^ (x & (y ^ z));
Expand Down Expand Up @@ -89,11 +90,12 @@ static inline void BLEND_OP(int I, u64 *W)
}

static void
sha512_transform(u64 *state, u64 *W, const u8 *input)
sha512_transform(u64 *state, const u8 *input)
{
u64 a, b, c, d, e, f, g, h, t1, t2;

int i;
u64 *W = get_cpu_var(msg_schedule);

/* load the input */
for (i = 0; i < 16; i++)
Expand Down Expand Up @@ -132,6 +134,8 @@ sha512_transform(u64 *state, u64 *W, const u8 *input)

/* erase our data */
a = b = c = d = e = f = g = h = t1 = t2 = 0;
memset(W, 0, sizeof(__get_cpu_var(msg_schedule)));
put_cpu_var(msg_schedule);
}

static void
Expand Down Expand Up @@ -187,10 +191,10 @@ sha512_update(struct crypto_tfm *tfm, const u8 *data, unsigned int len)
/* Transform as many times as possible. */
if (len >= part_len) {
memcpy(&sctx->buf[index], data, part_len);
sha512_transform(sctx->state, sctx->W, sctx->buf);
sha512_transform(sctx->state, sctx->buf);

for (i = part_len; i + 127 < len; i+=128)
sha512_transform(sctx->state, sctx->W, &data[i]);
sha512_transform(sctx->state, &data[i]);

index = 0;
} else {
Expand All @@ -199,9 +203,6 @@ sha512_update(struct crypto_tfm *tfm, const u8 *data, unsigned int len)

/* Buffer remaining input */
memcpy(&sctx->buf[index], &data[i], len - i);

/* erase our data */
memset(sctx->W, 0, sizeof(sctx->W));
}

static void
Expand Down

0 comments on commit f9e2bca

Please sign in to comment.