From: Linus Torvalds <torvalds@linux-foundation.org>
To: Git Mailing List <git@vger.kernel.org>,
Junio C Hamano <gitster@pobox.com>
Subject: [PATCH 5/7] block-sha1: macroize the rounds a bit further
Date: Thu, 6 Aug 2009 08:22:33 -0700 (PDT) [thread overview]
Message-ID: <alpine.LFD.2.01.0908060820110.3390@localhost.localdomain> (raw)
In-Reply-To: <alpine.LFD.2.01.0908060818220.3390@localhost.localdomain>
From: Linus Torvalds <torvalds@linux-foundation.org>
Date: Thu, 6 Aug 2009 07:20:54 -0700
Subject: [PATCH 5/7] block-sha1: macroize the rounds a bit further
Avoid repeating the shared parts of the different rounds by adding a
macro layer or two. It was already more cpp than C.
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
---
This makes things denser, and puts all the core rules in one place. That
first hunk really contains just about all of the important parts of SHA1.
The rest is just fluff and the necessary expansions etc.
block-sha1/sha1.c | 56 ++++++++++++++++++++++++----------------------------
1 files changed, 26 insertions(+), 30 deletions(-)
diff --git a/block-sha1/sha1.c b/block-sha1/sha1.c
index 80193d4..4837d58 100644
--- a/block-sha1/sha1.c
+++ b/block-sha1/sha1.c
@@ -94,6 +94,27 @@ void blk_SHA1_Final(unsigned char hashout[20], blk_SHA_CTX *ctx)
#endif
+/* This "rolls" over the 512-bit array */
+#define W(x) (array[(x)&15])
+
+/*
+ * Where do we get the source from? The first 16 iterations get it from
+ * the input data, the next mix it from the 512-bit array.
+ */
+#define SHA_SRC(t) htonl(data[t])
+#define SHA_MIX(t) SHA_ROL(W(t+13) ^ W(t+8) ^ W(t+2) ^ W(t), 1)
+
+#define SHA_ROUND(t, input, fn, constant) \
+ TEMP = input(t); W(t) = TEMP; \
+ TEMP += SHA_ROL(A,5) + (fn) + E + (constant); \
+ E = D; D = C; C = SHA_ROR(B, 2); B = A; A = TEMP
+
+#define T_0_15(t) SHA_ROUND(t, SHA_SRC, (((C^D)&B)^D) , 0x5a827999 )
+#define T_16_19(t) SHA_ROUND(t, SHA_MIX, (((C^D)&B)^D) , 0x5a827999 )
+#define T_20_39(t) SHA_ROUND(t, SHA_MIX, (B^C^D) , 0x6ed9eba1 )
+#define T_40_59(t) SHA_ROUND(t, SHA_MIX, ((B&C)|(D&(B|C))) , 0x8f1bbcdc )
+#define T_60_79(t) SHA_ROUND(t, SHA_MIX, (B^C^D) , 0xca62c1d6 )
+
static void blk_SHA1Block(blk_SHA_CTX *ctx, const unsigned int *data)
{
unsigned int A,B,C,D,E,TEMP;
@@ -105,53 +126,28 @@ static void blk_SHA1Block(blk_SHA_CTX *ctx, const unsigned int *data)
D = ctx->H[3];
E = ctx->H[4];
-#define T_0_15(t) \
- TEMP = htonl(data[t]); array[t] = TEMP; \
- TEMP += SHA_ROL(A,5) + (((C^D)&B)^D) + E + 0x5a827999; \
- E = D; D = C; C = SHA_ROR(B, 2); B = A; A = TEMP; \
-
+ /* Round 1 - iterations 0-16 take their input from 'data' */
T_0_15( 0); T_0_15( 1); T_0_15( 2); T_0_15( 3); T_0_15( 4);
T_0_15( 5); T_0_15( 6); T_0_15( 7); T_0_15( 8); T_0_15( 9);
T_0_15(10); T_0_15(11); T_0_15(12); T_0_15(13); T_0_15(14);
T_0_15(15);
-/* This "rolls" over the 512-bit array */
-#define W(x) (array[(x)&15])
-#define SHA_XOR(t) \
- TEMP = SHA_ROL(W(t+13) ^ W(t+8) ^ W(t+2) ^ W(t), 1); W(t) = TEMP;
-
-#define T_16_19(t) \
- SHA_XOR(t); \
- TEMP += SHA_ROL(A,5) + (((C^D)&B)^D) + E + 0x5a827999; \
- E = D; D = C; C = SHA_ROR(B, 2); B = A; A = TEMP; \
-
+ /* Round 1 - tail. Input from 512-bit mixing array */
T_16_19(16); T_16_19(17); T_16_19(18); T_16_19(19);
-#define T_20_39(t) \
- SHA_XOR(t); \
- TEMP += SHA_ROL(A,5) + (B^C^D) + E + 0x6ed9eba1; \
- E = D; D = C; C = SHA_ROR(B, 2); B = A; A = TEMP;
-
+ /* Round 2 */
T_20_39(20); T_20_39(21); T_20_39(22); T_20_39(23); T_20_39(24);
T_20_39(25); T_20_39(26); T_20_39(27); T_20_39(28); T_20_39(29);
T_20_39(30); T_20_39(31); T_20_39(32); T_20_39(33); T_20_39(34);
T_20_39(35); T_20_39(36); T_20_39(37); T_20_39(38); T_20_39(39);
-#define T_40_59(t) \
- SHA_XOR(t); \
- TEMP += SHA_ROL(A,5) + ((B&C)|(D&(B|C))) + E + 0x8f1bbcdc; \
- E = D; D = C; C = SHA_ROR(B, 2); B = A; A = TEMP;
-
+ /* Round 3 */
T_40_59(40); T_40_59(41); T_40_59(42); T_40_59(43); T_40_59(44);
T_40_59(45); T_40_59(46); T_40_59(47); T_40_59(48); T_40_59(49);
T_40_59(50); T_40_59(51); T_40_59(52); T_40_59(53); T_40_59(54);
T_40_59(55); T_40_59(56); T_40_59(57); T_40_59(58); T_40_59(59);
-#define T_60_79(t) \
- SHA_XOR(t); \
- TEMP += SHA_ROL(A,5) + (B^C^D) + E + 0xca62c1d6; \
- E = D; D = C; C = SHA_ROR(B, 2); B = A; A = TEMP;
-
+ /* Round 4 */
T_60_79(60); T_60_79(61); T_60_79(62); T_60_79(63); T_60_79(64);
T_60_79(65); T_60_79(66); T_60_79(67); T_60_79(68); T_60_79(69);
T_60_79(70); T_60_79(71); T_60_79(72); T_60_79(73); T_60_79(74);
--
1.6.4.31.g154b2.dirty
next prev parent reply other threads:[~2009-08-06 15:23 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-08-06 15:13 [PATCH 0/7] block-sha1: improved SHA1 hashing Linus Torvalds
2009-08-06 15:15 ` [PATCH 1/7] block-sha1: add new optimized C 'block-sha1' routines Linus Torvalds
2009-08-06 15:16 ` [PATCH 2/7] block-sha1: try to use rol/ror appropriately Linus Torvalds
2009-08-06 15:18 ` [PATCH 3/7] block-sha1: make the 'ntohl()' part of the first SHA1 loop Linus Torvalds
2009-08-06 15:20 ` [PATCH 4/7] block-sha1: re-use the temporary array as we calculate the SHA1 Linus Torvalds
2009-08-06 15:22 ` Linus Torvalds [this message]
2009-08-06 15:24 ` [PATCH 6/7] block-sha1: Use '(B&C)+(D&(B^C))' instead of '(B&C)|(D&(B|C))' in round 3 Linus Torvalds
2009-08-06 15:25 ` [PATCH 7/7] block-sha1: get rid of redundant 'lenW' context Linus Torvalds
2009-08-06 18:25 ` [PATCH 2/7] block-sha1: try to use rol/ror appropriately Bert Wesarg
2009-08-06 17:22 ` [PATCH 0/7] block-sha1: improved SHA1 hashing Artur Skawina
2009-08-06 18:09 ` Linus Torvalds
2009-08-06 19:10 ` Artur Skawina
2009-08-06 19:41 ` Linus Torvalds
2009-08-06 20:08 ` Artur Skawina
2009-08-06 20:53 ` Linus Torvalds
2009-08-06 21:24 ` Linus Torvalds
2009-08-06 21:39 ` Artur Skawina
2009-08-06 21:52 ` Artur Skawina
2009-08-06 22:27 ` Linus Torvalds
2009-08-06 22:33 ` Linus Torvalds
2009-08-06 23:19 ` Artur Skawina
2009-08-06 23:42 ` Linus Torvalds
2009-08-06 22:55 ` Artur Skawina
2009-08-06 23:04 ` Linus Torvalds
2009-08-06 23:25 ` Linus Torvalds
2009-08-07 0:13 ` Linus Torvalds
2009-08-07 1:30 ` Artur Skawina
2009-08-07 1:55 ` Linus Torvalds
2009-08-07 0:53 ` Artur Skawina
2009-08-07 2:23 ` Linus Torvalds
2009-08-07 4:16 ` Artur Skawina
[not found] ` <alpine.LFD.2.01.0908071614310.3288@localhost.localdomain>
[not found] ` <4A7CBD28.6070306@gmail.com>
[not found] ` <4A7CBF47.9000903@gmail.com>
[not found] ` <alpine.LFD.2.01.0908071700290.3288@localhost.localdomain>
[not found] ` <4A7CC380.3070008@gmail.com>
2009-08-08 4:16 ` Linus Torvalds
2009-08-08 5:34 ` Artur Skawina
2009-08-08 17:10 ` Linus Torvalds
2009-08-08 18:12 ` Artur Skawina
2009-08-08 22:58 ` Artur Skawina
2009-08-08 23:36 ` Artur Skawina
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=alpine.LFD.2.01.0908060820110.3390@localhost.localdomain \
--to=torvalds@linux-foundation.org \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).