From aecde8cd6f61b81e2ba64a0fac24ce3933b8e851 Mon Sep 17 00:00:00 2001
From: =?UTF8?q?Niels=20M=C3=B6ller?=
Date: Mon, 20 Jun 2011 15:54:21 +0200
Subject: [PATCH] (SBOX0_INVERSE): Eliminated temporaries.
Rev: nettle/serpentdecrypt.c:1.4

serpentdecrypt.c  68 +++++++++++++++++++++++++++++
1 file changed, 42 insertions(+), 26 deletions()
diff git a/serpentdecrypt.c b/serpentdecrypt.c
index 1a6fbb47..2256fa84 100644
 a/serpentdecrypt.c
+++ b/serpentdecrypt.c
@@ 66,33 +66,49 @@
(GPL), although some comments in the code still say otherwise. You
are welcome to use Serpent for any application." */
/* FIXME: Except when used within the key schedule, the inputs are not
 used after the substitution, and hence we could allow them to be
 destroyed. Can this freedom be used to optimize the sboxes? */

+/* Original singleassignment form:
+
+ t01 = x2 ^ x3;
+ t02 = x0  x1;
+ t03 = x1  x2;
+ t04 = x2 & t01;
+ t05 = t02 ^ t01;
+ t06 = x0  t04;
+ y2 = ~ t05;
+ t08 = x1 ^ x3;
+ t09 = t03 & t08;
+ t10 = x3  y2;
+ y1 = t09 ^ t06;
+ t12 = x0  t05;
+ t13 = y1 ^ t12;
+ t14 = t03 ^ t10;
+ t15 = x0 ^ x2;
+ y3 = t14 ^ t13;
+ t17 = t05 & t13;
+ t18 = t14  t17;
+ y0 = t15 ^ t18;
+*/
#define SBOX0_INVERSE(type, x0, x1, x2, x3, y0, y1, y2, y3) \
 do { \
 type t02, t03, t04, t05, t06, t08, t09, t10; \
 type t12, t13, t14, t15, t17, t18, t01; \
 t01 = x2 ^ x3; \
 t02 = x0  x1; \
 t03 = x1  x2; \
 t04 = x2 & t01; \
 t05 = t02 ^ t01; \
 t06 = x0  t04; \
 y2 = ~ t05; \
 t08 = x1 ^ x3; \
 t09 = t03 & t08; \
 t10 = x3  y2; \
 y1 = t09 ^ t06; \
 t12 = x0  t05; \
 t13 = y1 ^ t12; \
 t14 = t03 ^ t10; \
 t15 = x0 ^ x2; \
 y3 = t14 ^ t13; \
 t17 = t05 & t13; \
 t18 = t14  t17; \
 y0 = t15 ^ t18; \
+ do { \
+ y0 = x0 ^ x2; \
+ y2 = x0  x1; \
+ y1 = x2 ^ x3; \
+ y2 ^= y1; \
+ y1 &= x2; \
+ x2 = x1; \
+ x1 ^= x3; \
+ y1 = x0; \
+ x1 &= x2; \
+ y1 ^= x1; \
+ x0 = y2; \
+ x0 ^= y1; \
+ x1 = y2 & x0; \
+ y2 = ~ y2; \
+ x3 = y2; \
+ x3 ^= x2; \
+ y3 = x3 ^ x0; \
+ x1 = x3; \
+ y0 ^= x1; \
} while (0)
#define SBOX1_INVERSE(type, x0, x1, x2, x3, y0, y1, y2, y3) \

GitLab