From 836e559840f7b1ce0f8c06ced296f9abd3142ca0 Mon Sep 17 00:00:00 2001 From: Herbert Xu Date: Sun, 9 Jul 2006 14:49:42 +1000 Subject: [PATCH] --- yaml --- r: 34223 b: refs/heads/master c: ee7564166da9e218c3f605ee78ff16599d4d5a05 h: refs/heads/master i: 34221: b37202672354f0b075d40977814170e69f1e9021 34219: 797fa2e61365105e66d9cb58eca6b2018eb5cdda 34215: ff5c3fda70b411309bc6589bfd2911e1d0c34c4f 34207: e2216784d2f2c2f941e294644c6c703197888a8c v: v3 --- [refs] | 2 +- trunk/crypto/digest.c | 16 ++++++++++------ trunk/crypto/internal.h | 9 ++++++++- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/[refs] b/[refs] index 160a2b6fa46b..76e4b627cc75 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 560c06ae1ab7c677002ea3b6ac83521bf12ee07d +refs/heads/master: ee7564166da9e218c3f605ee78ff16599d4d5a05 diff --git a/trunk/crypto/digest.c b/trunk/crypto/digest.c index 0df7f392a56a..19e75563776b 100644 --- a/trunk/crypto/digest.c +++ b/trunk/crypto/digest.c @@ -66,14 +66,18 @@ static void update(struct crypto_tfm *tfm, static void final(struct crypto_tfm *tfm, u8 *out) { unsigned long alignmask = crypto_tfm_alg_alignmask(tfm); + struct digest_alg *digest = &tfm->__crt_alg->cra_digest; + if (unlikely((unsigned long)out & alignmask)) { - unsigned int size = crypto_tfm_alg_digestsize(tfm); - u8 buffer[size + alignmask]; - u8 *dst = (u8 *)ALIGN((unsigned long)buffer, alignmask + 1); - tfm->__crt_alg->cra_digest.dia_final(tfm, dst); - memcpy(out, dst, size); + unsigned long align = alignmask + 1; + unsigned long addr = (unsigned long)crypto_tfm_ctx(tfm); + u8 *dst = (u8 *)ALIGN(addr, align) + + ALIGN(tfm->__crt_alg->cra_ctxsize, align); + + digest->dia_final(tfm, dst); + memcpy(out, dst, digest->dia_digestsize); } else - tfm->__crt_alg->cra_digest.dia_final(tfm, out); + digest->dia_final(tfm, out); } static int nosetkey(struct crypto_tfm *tfm, const u8 *key, unsigned int keylen) diff --git a/trunk/crypto/internal.h b/trunk/crypto/internal.h index 03c00b0e6b60..b110b979b988 100644 --- a/trunk/crypto/internal.h +++ b/trunk/crypto/internal.h @@ -99,7 +99,14 @@ static inline void crypto_exit_proc(void) static inline unsigned int crypto_digest_ctxsize(struct crypto_alg *alg, int flags) { - return alg->cra_ctxsize; + unsigned int len = alg->cra_ctxsize; + + if (alg->cra_alignmask) { + len = ALIGN(len, (unsigned long)alg->cra_alignmask + 1); + len += alg->cra_digest.dia_digestsize; + } + + return len; } static inline unsigned int crypto_cipher_ctxsize(struct crypto_alg *alg,