51 broke -E logic completely, rewise it
[tfcrypt.git] / tfcore.h
1 #ifndef _THREEFISH_CIPHER_CORE_HEADER
2 #define _THREEFISH_CIPHER_CORE_HEADER
3
4 #ifndef _THREEFISH_CIPHER_DEFINITIONS_HEADER
5 #error Threefish definitions header is required! Include tfdef.h first.
6 #endif
7
8 #define ROL(x, s, max) ((x << s) | (x >> (-s & (max-1))))
9 #define ROR(x, s, max) ((x >> s) | (x << (-s & (max-1))))
10
11 #define KE_MIX(x, y, k1, k2, sl)                                \
12         do {                                                    \
13                 x += k1;                                        \
14                 y += x;                                         \
15                 y += k2;                                        \
16                 x = ROL(x, sl, TF_UNIT_BITS);                   \
17                 x ^= y;                                         \
18         } while (0)
19
20 #define BE_MIX(x, y, sl)                                        \
21         do {                                                    \
22                 x += y;                                         \
23                 y = ROL(y, sl, TF_UNIT_BITS);                   \
24                 y ^= x;                                         \
25         } while (0)
26
27 #define KD_MIX(x, y, k1, k2, sr)                                \
28         do {                                                    \
29                 x ^= y;                                         \
30                 x = ROR(x, sr, TF_UNIT_BITS);                   \
31                 y -= x;                                         \
32                 y -= k2;                                        \
33                 x -= k1;                                        \
34         } while (0)
35
36 #define BD_MIX(x, y, sr)                                        \
37         do {                                                    \
38                 y ^= x;                                         \
39                 y = ROR(y, sr, TF_UNIT_BITS);                   \
40                 x -= y;                                         \
41         } while (0)
42
43 #define THREEFISH_CONST 0x1bd11bdaa9fc1a22ULL
44
45 #if defined(TF_256BITS)
46 enum tf_rotations {
47         TFS_KS01 = 14, TFS_KS02 = 16, TFS_KS03 = 25, TFS_KS04 = 33,
48         TFS_BS01 = 52, TFS_BS02 = 57, TFS_BS03 = 23, TFS_BS04 = 40,
49         TFS_BS05 =  5, TFS_BS06 = 37, TFS_BS07 = 46, TFS_BS08 = 12,
50         TFS_BS09 = 58, TFS_BS10 = 22, TFS_BS11 = 32, TFS_BS12 = 32,
51 };
52 #elif defined(TF_512BITS)
53 enum tf_rotations {
54         TFS_KS01 = 46, TFS_KS02 = 36, TFS_KS03 = 19, TFS_KS04 = 37,
55         TFS_KS05 = 39, TFS_KS06 = 30, TFS_KS07 = 34, TFS_KS08 = 24,
56         TFS_BS01 = 33, TFS_BS02 = 27, TFS_BS03 = 14, TFS_BS04 = 42,
57         TFS_BS05 = 17, TFS_BS06 = 49, TFS_BS07 = 36, TFS_BS08 = 39,
58         TFS_BS09 = 44, TFS_BS10 =  9, TFS_BS11 = 54, TFS_BS12 = 56,
59         TFS_BS13 = 13, TFS_BS14 = 50, TFS_BS15 = 10, TFS_BS16 = 17,
60         TFS_BS17 = 25, TFS_BS18 = 29, TFS_BS19 = 39, TFS_BS20 = 43,
61         TFS_BS21 =  8, TFS_BS22 = 35, TFS_BS23 = 56, TFS_BS24 = 22,
62 };
63 #elif defined(TF_1024BITS)
64 enum tf_rotations {
65         TFS_KS01 = 24, TFS_KS02 = 13, TFS_KS03 =  8, TFS_KS04 = 47,
66         TFS_KS05 =  8, TFS_KS06 = 17, TFS_KS07 = 22, TFS_KS08 = 37,
67         TFS_KS09 = 41, TFS_KS10 =  9, TFS_KS11 = 37, TFS_KS12 = 31,
68         TFS_KS13 = 12, TFS_KS14 = 47, TFS_KS15 = 44, TFS_KS16 = 30,
69         TFS_BS01 = 38, TFS_BS02 = 19, TFS_BS03 = 10, TFS_BS04 = 55,
70         TFS_BS05 = 49, TFS_BS06 = 18, TFS_BS07 = 23, TFS_BS08 = 52,
71         TFS_BS09 = 33, TFS_BS10 =  4, TFS_BS11 = 51, TFS_BS12 = 13,
72         TFS_BS13 = 34, TFS_BS14 = 41, TFS_BS15 = 59, TFS_BS16 = 17,
73         TFS_BS17 =  5, TFS_BS18 = 20, TFS_BS19 = 48, TFS_BS20 = 41,
74         TFS_BS21 = 47, TFS_BS22 = 28, TFS_BS23 = 16, TFS_BS24 = 25,
75         TFS_BS25 = 16, TFS_BS26 = 34, TFS_BS27 = 56, TFS_BS28 = 51,
76         TFS_BS29 =  4, TFS_BS30 = 53, TFS_BS31 = 42, TFS_BS32 = 41,
77         TFS_BS33 = 31, TFS_BS34 = 44, TFS_BS35 = 47, TFS_BS36 = 46,
78         TFS_BS37 = 19, TFS_BS38 = 42, TFS_BS39 = 44, TFS_BS40 = 25,
79         TFS_BS41 =  9, TFS_BS42 = 48, TFS_BS43 = 35, TFS_BS44 = 52,
80         TFS_BS45 = 23, TFS_BS46 = 31, TFS_BS47 = 37, TFS_BS48 = 20,
81 };
82 #else
83 #error No cipher was defined! Aborting build.
84 #endif
85
86 #endif