Files
kernel-tenderloin-3.0/crypto
Alexey Dobriyan 3ce5564096 crypto: sha512 - reduce stack usage to safe number
commit 51fc6dc8f948047364f7d42a4ed89b416c6cc0a3 upstream.

For rounds 16--79, W[i] only depends on W[i - 2], W[i - 7], W[i - 15] and W[i - 16].
Consequently, keeping all W[80] array on stack is unnecessary,
only 16 values are really needed.

Using W[16] instead of W[80] greatly reduces stack usage
(~750 bytes to ~340 bytes on x86_64).

Line by line explanation:
* BLEND_OP
  array is "circular" now, all indexes have to be modulo 16.
  Round number is positive, so remainder operation should be
  without surprises.

* initial full message scheduling is trimmed to first 16 values which
  come from data block, the rest is calculated before it's needed.

* original loop body is unrolled version of new SHA512_0_15 and
  SHA512_16_79 macros, unrolling was done to not do explicit variable
  renaming. Otherwise it's the very same code after preprocessing.
  See sha1_transform() code which does the same trick.

Patch survives in-tree crypto test and original bugreport test
(ping flood with hmac(sha512).

See FIPS 180-2 for SHA-512 definition
http://csrc.nist.gov/publications/fips/fips180-2/fips180-2withchangenotice.pdf

Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2012-02-03 09:18:53 -08:00
..
2011-03-31 11:26:23 -03:00
2010-02-16 20:24:07 +08:00
2011-03-31 11:26:23 -03:00
2010-02-16 20:26:46 +08:00
2010-12-02 14:47:16 +08:00
2010-10-26 16:52:08 -07:00
2010-11-13 21:47:55 +09:00
2010-02-16 20:29:45 +08:00
2010-02-16 20:31:19 +08:00
2010-05-26 10:36:51 +10:00
2008-06-02 15:46:51 +10:00
2010-02-16 20:33:49 +08:00
2010-12-02 14:47:16 +08:00
2008-08-29 15:50:02 +10:00
2010-12-02 14:47:16 +08:00
2011-03-31 11:26:23 -03:00
2008-04-21 10:19:34 +08:00
2009-02-17 20:00:11 +08:00
2008-04-21 10:19:34 +08:00
2008-12-25 11:02:16 +11:00
2011-08-15 18:31:35 -07:00
2008-04-21 10:19:34 +08:00
2008-04-21 10:19:34 +08:00
2008-12-25 11:02:21 +11:00
2011-03-31 11:26:23 -03:00
2008-12-25 11:02:22 +11:00
2011-03-31 11:26:23 -03:00