From e9045bd365003feb8ca68d3da29e39a1f64c1e23 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Niels=20M=C3=B6ller?= <nisse@lysator.liu.se>
Date: Sun, 1 Apr 2012 20:14:35 +0200
Subject: [PATCH] New macro QROUND.

---
 ChangeLog |  2 ++
 salsa20.c | 48 ++++++++++++++++--------------------------------
 2 files changed, 18 insertions(+), 32 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index d7ca20f7..29e6283d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,8 @@
 2012-04-01  Niels Möller  <nisse@lysator.liu.se>
 
 	* salsa20.c (LE_SWAP32): Typo fix for big-endian case.
+	(QROUND): New macro.
+	(salsa20_hash): Use it.
 
 2012-03-31  Niels Möller  <nisse@lysator.liu.se>
 
diff --git a/salsa20.c b/salsa20.c
index 927cefc8..19c82056 100644
--- a/salsa20.c
+++ b/salsa20.c
@@ -49,6 +49,13 @@
 #define LE_SWAP32(v) (v)
 #endif
 
+#define QROUND(x0, x1, x2, x3) do { \
+  x1 ^= ROTL32(7, x0 + x3);	    \
+  x2 ^= ROTL32(9, x1 + x0);	    \
+  x3 ^= ROTL32(13, x2 + x1);	    \
+  x0 ^= ROTL32(18, x3 + x2);	    \
+  } while(0)
+
 static void
 salsa20_hash(uint32_t *output, const uint32_t *input)
 {
@@ -58,38 +65,15 @@ salsa20_hash(uint32_t *output, const uint32_t *input)
   memcpy (x, input, sizeof (x));
 
   for (i = 20;i > 0;i -= 2) {
-    x[ 4] ^= ROTL32( 7, x[ 0] + x[12]);
-    x[ 8] ^= ROTL32( 9, x[ 4] + x[ 0]);
-    x[12] ^= ROTL32(13, x[ 8] + x[ 4]);
-    x[ 0] ^= ROTL32(18, x[12] + x[ 8]);
-    x[ 9] ^= ROTL32( 7, x[ 5] + x[ 1]);
-    x[13] ^= ROTL32( 9, x[ 9] + x[ 5]);
-    x[ 1] ^= ROTL32(13, x[13] + x[ 9]);
-    x[ 5] ^= ROTL32(18, x[ 1] + x[13]);
-    x[14] ^= ROTL32( 7, x[10] + x[ 6]);
-    x[ 2] ^= ROTL32( 9, x[14] + x[10]);
-    x[ 6] ^= ROTL32(13, x[ 2] + x[14]);
-    x[10] ^= ROTL32(18, x[ 6] + x[ 2]);
-    x[ 3] ^= ROTL32( 7, x[15] + x[11]);
-    x[ 7] ^= ROTL32( 9, x[ 3] + x[15]);
-    x[11] ^= ROTL32(13, x[ 7] + x[ 3]);
-    x[15] ^= ROTL32(18, x[11] + x[ 7]);
-    x[ 1] ^= ROTL32( 7, x[ 0] + x[ 3]);
-    x[ 2] ^= ROTL32( 9, x[ 1] + x[ 0]);
-    x[ 3] ^= ROTL32(13, x[ 2] + x[ 1]);
-    x[ 0] ^= ROTL32(18, x[ 3] + x[ 2]);
-    x[ 6] ^= ROTL32( 7, x[ 5] + x[ 4]);
-    x[ 7] ^= ROTL32( 9, x[ 6] + x[ 5]);
-    x[ 4] ^= ROTL32(13, x[ 7] + x[ 6]);
-    x[ 5] ^= ROTL32(18, x[ 4] + x[ 7]);
-    x[11] ^= ROTL32( 7, x[10] + x[ 9]);
-    x[ 8] ^= ROTL32( 9, x[11] + x[10]);
-    x[ 9] ^= ROTL32(13, x[ 8] + x[11]);
-    x[10] ^= ROTL32(18, x[ 9] + x[ 8]);
-    x[12] ^= ROTL32( 7, x[15] + x[14]);
-    x[13] ^= ROTL32( 9, x[12] + x[15]);
-    x[14] ^= ROTL32(13, x[13] + x[12]);
-    x[15] ^= ROTL32(18, x[14] + x[13]);
+    QROUND(x[0], x[4], x[8], x[12]);
+    QROUND(x[5], x[9], x[13], x[1]);
+    QROUND(x[10], x[14], x[2], x[6]);
+    QROUND(x[15], x[3], x[7], x[11]);
+
+    QROUND(x[0], x[1], x[2], x[3]);
+    QROUND(x[5], x[6], x[7], x[4]);
+    QROUND(x[10], x[11], x[8], x[9]);
+    QROUND(x[15], x[12], x[13], x[14]);
   }
   for (i = 0;i < _SALSA20_INPUT_LENGTH;++i)
     {
-- 
GitLab