#include "aes.h" #define f_rnd(i,a,b,c,d) (u = rotl32 (d * (d + d + 1), 5), t = rotl32 (b * (b + b + 1), 5), a = rotl32 (a ^ t, u) + ks->rc6.key[i], c = rotl32 (c ^ u, t) + ks->rc6.key[i + 1]) #define i_rnd(i,a,b,c,d) (u = rotl32 (d * (d + d + 1), 5), t = rotl32 (b * (b + b + 1), 5), c = rotr32 (c - ks->rc6.key[i + 1], t) ^ u, a = rotr32 (a - ks->rc6.key[i], u) ^ t) aes_keystream * rc6_setkey (const unsigned long *key, aes_keystream *ks) { unsigned long transform[8], i, k = 0xB7E15163, a = 0, b = 0, x = 0, y = 0; for (i = 0; i < 44; i++) ks->rc6.key[i] = k, k += 0x9E3779B9; for (i = 0; i < 8; i++) transform[i] = lsf32 (key[i]); for (i = 0; i < 132; i++) { a = rotl32 (ks->rc6.key[x] + a + b, 3); b += a; b = rotl32 (transform[y] + b, b); ks->rc6.key[x] = a; transform[y] = b; x = (x == 43 ? 0 : x + 1); y = (y == 7 ? 0 : y + 1); } return ks; } OCTET * rc6_encrypt (OCTET one_block[2], const aes_keystream *ks) { unsigned long a = lsf32 (one_block->D[0]), b = lsf32 (one_block->D[1]) + ks->rc6.key[0], c = lsf32 (one_block->D[2]), d = lsf32 (one_block->D[3]) + ks->rc6.key[1], t, u; f_rnd ( 2,a,b,c,d); f_rnd ( 4,b,c,d,a); f_rnd ( 6,c,d,a,b); f_rnd ( 8,d,a,b,c); f_rnd (10,a,b,c,d); f_rnd (12,b,c,d,a); f_rnd (14,c,d,a,b); f_rnd (16,d,a,b,c); f_rnd (18,a,b,c,d); f_rnd (20,b,c,d,a); f_rnd (22,c,d,a,b); f_rnd (24,d,a,b,c); f_rnd (26,a,b,c,d); f_rnd (28,b,c,d,a); f_rnd (30,c,d,a,b); f_rnd (32,d,a,b,c); f_rnd (34,a,b,c,d); f_rnd (36,b,c,d,a); f_rnd (38,c,d,a,b); f_rnd (40,d,a,b,c); a += ks->rc6.key[42]; c += ks->rc6.key[43]; one_block->D[0] = a; one_block->D[1] = b; one_block->D[2] = c; one_block->D[3] = d; return one_block; } OCTET * rc6_decrypt (OCTET one_block[2], const aes_keystream *ks) { unsigned long a = lsf32 (one_block->D[0]) - ks->rc6.key[42], b = lsf32 (one_block->D[1]), c = lsf32 (one_block->D[2]) - ks->rc6.key[43], d = lsf32 (one_block->D[3]), t, u; i_rnd(40,d,a,b,c); i_rnd(38,c,d,a,b); i_rnd(36,b,c,d,a); i_rnd(34,a,b,c,d); i_rnd(32,d,a,b,c); i_rnd(30,c,d,a,b); i_rnd(28,b,c,d,a); i_rnd(26,a,b,c,d); i_rnd(24,d,a,b,c); i_rnd(22,c,d,a,b); i_rnd(20,b,c,d,a); i_rnd(18,a,b,c,d); i_rnd(16,d,a,b,c); i_rnd(14,c,d,a,b); i_rnd(12,b,c,d,a); i_rnd(10,a,b,c,d); i_rnd( 8,d,a,b,c); i_rnd( 6,c,d,a,b); i_rnd( 4,b,c,d,a); i_rnd( 2,a,b,c,d); b -= ks->rc6.key[0]; d -= ks->rc6.key[1]; one_block->D[0] = a; one_block->D[1] = b; one_block->D[2] = c; one_block->D[3] = d; return one_block; }