threefish-0.1: cbits/threefish256.c
#include "threefish.h"
W64 key_const = 0x1BD11BDAA9FC1A22;
void encrypt256(W64* key, W64 t0, W64 t1, W64* in, W64* out) {
int r;
W64 k4 = key[0] ^ key[1] ^ key[2] ^ key[3] ^ key_const;
W64 ks[5] = {key[0], key[1], key[2], key[3], k4};
W64 ts[3] = {t0, t1, t0 ^ t1};
W64 a = in[0] + ks[0];
W64 b = in[1] + ks[1] + ts[0];
W64 c = in[2] + ks[2] + ts[1];
W64 d = in[3] + ks[3];
for(r = 2; r < 20; r += 2) {
a += b; b = rl(b, 14) ^ a;
c += d; d = rl(d, 16) ^ c;
a += d; d = rl(d, 52) ^ a;
c += b; b = rl(b, 57) ^ c;
a += b; b = rl(b, 23) ^ a;
c += d; d = rl(d, 40) ^ c;
a += d; d = rl(d, 5) ^ a;
c += b; b = rl(b, 37) ^ c;
a += ks[(r-1) % 5];
b += ks[r % 5] + ts[(r-1) % 3];
c += ks[(r+1) % 5] + ts[r % 3];
d += ks[(r+2) % 5] + (r-1);
a += b; b = rl(b, 25) ^ a;
c += d; d = rl(d, 33) ^ c;
a += d; d = rl(d, 46) ^ a;
c += b; b = rl(b, 12) ^ c;
a += b; b = rl(b, 58) ^ a;
c += d; d = rl(d, 22) ^ c;
a += d; d = rl(d, 32) ^ a;
c += b; b = rl(b, 32) ^ c;
a += ks[r % 5];
b += ks[(r+1) % 5] + ts[r % 3];
c += ks[(r+2) % 5] + ts[(r+1) % 3];
d += ks[(r+3) % 5] + r;
}
out[0] = a; out[1] = b; out[2] = c; out[3] = d;
}
void decrypt256(W64* key, W64 t0, W64 t1, W64* in, W64* out) {
int r;
W64 k4 = key[0] ^ key[1] ^ key[2] ^ key[3] ^ key_const;
W64 ks[5] = {key[0], key[1], key[2], key[3], k4};
W64 ts[3] = {t0, t1, t0 ^ t1};
W64 a = in[0] + ks[0];
W64 b = in[1] + ks[1] + ts[0];
W64 c = in[2] + ks[2] + ts[1];
W64 d = in[3] + ks[3];
for(r = 18; r >= 2; r -= 2) {
a -= ks[r % 5];
b -= ks[(r+1) % 5] + ts[r % 3];
c -= ks[(r+2) % 5] + ts[(r+1) % 3];
d -= ks[(r+3) % 5] + r;
d = rr(d^a, 32); a -= d;
b = rr(b^c, 32); c -= b;
b = rr(b^a, 58); a -= b;
d = rr(d^c, 22); c -= d;
d = rr(d^a, 46); a -= d;
b = rr(b^c, 12); c -= b;
b = rr(b^a, 25); a -= b;
d = rr(d^c, 33); c -= d;
a -= ks[(r-1) % 5];
b -= ks[r % 5] + ts[(r-1) % 3];
c -= ks[(r+1) % 5] + ts[r % 3];
d -= ks[(r+2) % 5] + (r-1);
d = rr(d^a, 5); a -= d;
b = rr(b^c, 37); c -= b;
b = rr(b^a, 23); a -= b;
d = rr(d^c, 40); c -= d;
d = rr(d^a, 52); a -= d;
b = rr(b^c, 57); c -= b;
b = rr(b^a, 14); a -= b;
d = rr(d^c, 16); c -= d;
}
out[0] = a - ks[0]; out[1] = b - (ks[1] + ts[0]);
out[2] = c - (ks[2] + ts[1]); out[3] = d - ks[3];
}