On 09/29/2010 02:28 AM, Sandy Harris wrote:
pht2(T *a, T *b)
{
T x, y ;
x = *a + *b ;
y = x + *a ; // 2*a+b
if (z& 1) {
*a = x ;
*b = y ;
}
else {
*a = y ;
*b = x ;
}
z>>= 1 ;
}
32 bits of z then control the 32 2-way PHTs that
make up the 16-way one. The key-derived data
z is directly controlling a bunch of if/else choices.
We can transform this so that the low bit of z basically controls a
conditional swap:
void pht2(T & a, T & b) // I like C++ refs
{
b += a;
a += b;
if (z & 1)
swap(a, b);
z >>= 1;
}
We can implement a conditional swap without the 'if' statement:
void cswap(bool cond, T & a, T & b)
{
// m is just a mask formed by copying the low bit of cond
// to all positions.
T m = cond ? T(-1) : T(0); // assuming T is unsigned here
a ^= b & m;
b ^= a & m;
a ^= b & m;
}
void pht2(T & a, T & b) // I like C++ refs
{
b += a;
a += b;
cswap(z & 1, a, b);
z >>= 1;
}
But looking again at your code comment:
T x = *a + *b;
T y = x + *a; // 2*a+b
We're really just swapping between (a + b) and (2a + b).
Since (a << 0 == a) and (a << 1 == 2a), we can write:
void pht2(T & a, T & b) // C++ refs again
{
bool r = z & 1;
z >>= 1;
T a_in = a;
a = b;
a += a_in << r;
b += a_in << !r;
}
So it's equivalent to a data-dependent shift or (with minor adjustment)
rotate operation.
I have another interesting variation in mind, but it will have to wait,
I left my laptop charger at home today.
- Marsh
_______________________________________________
cryptography mailing list
[email protected]
http://lists.randombit.net/mailman/listinfo/cryptography