51 broke -E logic completely, rewise it
[tfcrypt.git] / tfdec.c
1 #include "tfdef.h"
2 #include "tfcore.h"
3
4 #if defined(TF_256BITS)
5
6 #define PROCESS_BLOCKP(x,k1,k2,k3,k4,k5,k6)                                             \
7         do {                                                                            \
8                 BD_MIX(Z, Y, TFS_BS06); BD_MIX(X, T, TFS_BS05);                         \
9                 BD_MIX(Z, T, TFS_BS04); BD_MIX(X, Y, TFS_BS03);                         \
10                 BD_MIX(Z, Y, TFS_BS02); BD_MIX(X, T, TFS_BS01);                         \
11                                                                                         \
12                 KD_MIX(T, Z, k4 + x, k5 + k6, TFS_KS02);                                \
13                 KD_MIX(Y, X, k1 + k2, k3, TFS_KS01);                                    \
14         } while (0)
15
16 #define PROCESS_BLOCKN(x,k1,k2,k3,k4,k5,k6)                                             \
17         do {                                                                            \
18                 BD_MIX(Z, Y, TFS_BS12); BD_MIX(X, T, TFS_BS11);                         \
19                 BD_MIX(Z, T, TFS_BS10); BD_MIX(X, Y, TFS_BS09);                         \
20                 BD_MIX(Z, Y, TFS_BS08); BD_MIX(X, T, TFS_BS07);                         \
21                                                                                         \
22                 KD_MIX(T, Z, k4 + x, k5 + k6, TFS_KS04);                                \
23                 KD_MIX(Y, X, k1 + k2, k3, TFS_KS03);                                    \
24         } while (0)
25
26 void tf_decrypt_rawblk(TF_UNIT_TYPE *O, const TF_UNIT_TYPE *I, const TF_UNIT_TYPE *K)
27 {
28         TF_UNIT_TYPE X, Y, Z, T;
29         TF_UNIT_TYPE K0, K1, K2, K3;
30         TF_UNIT_TYPE K4, T0, T1, T2;
31
32         X = I[0]; Y = I[1]; Z = I[2]; T = I[3];
33
34         K0 = K[0]; K1 = K[1]; K2 = K[2]; K3 = K[3];
35         K4 = K[4]; T0 = K[5]; T1 = K[6]; T2 = K[7];
36
37         X -= K3; Y -= K4 + T0; Z -= K0 + T1; T -= K1 + 18;
38
39         PROCESS_BLOCKN(17,K3,T2,K2,K0,K4,T0);
40         PROCESS_BLOCKP(16,K2,T1,K1,K4,K3,T2);
41
42         PROCESS_BLOCKN(15,K1,T0,K0,K3,K2,T1);
43         PROCESS_BLOCKP(14,K0,T2,K4,K2,K1,T0);
44         PROCESS_BLOCKN(13,K4,T1,K3,K1,K0,T2);
45         PROCESS_BLOCKP(12,K3,T0,K2,K0,K4,T1);
46
47         PROCESS_BLOCKN(11,K2,T2,K1,K4,K3,T0);
48         PROCESS_BLOCKP(10,K1,T1,K0,K3,K2,T2);
49         PROCESS_BLOCKN( 9,K0,T0,K4,K2,K1,T1);
50         PROCESS_BLOCKP( 8,K4,T2,K3,K1,K0,T0);
51
52         PROCESS_BLOCKN( 7,K3,T1,K2,K0,K4,T2);
53         PROCESS_BLOCKP( 6,K2,T0,K1,K4,K3,T1);
54         PROCESS_BLOCKN( 5,K1,T2,K0,K3,K2,T0);
55         PROCESS_BLOCKP( 4,K0,T1,K4,K2,K1,T2);
56
57         PROCESS_BLOCKN( 3,K4,T0,K3,K1,K0,T1);
58         PROCESS_BLOCKP( 2,K3,T2,K2,K0,K4,T0);
59         PROCESS_BLOCKN( 1,K2,T1,K1,K4,K3,T2);
60         PROCESS_BLOCKP( 0,K1,T0,K0,K3,K2,T1);
61
62         O[0] = X; O[1] = Y; O[2] = Z; O[3] = T;
63 }
64
65 #elif defined(TF_512BITS)
66
67 #define PROCESS_BLOCKP(x,k1,k2,k3,k4,k5,k6,k7,k8,k9,k10)                                \
68         do {                                                                            \
69                 BD_MIX(E, T, TFS_BS12); BD_MIX(Z, W, TFS_BS11);                         \
70                 BD_MIX(X, N, TFS_BS10); BD_MIX(V, Y, TFS_BS09);                         \
71                 BD_MIX(Z, N, TFS_BS08); BD_MIX(X, W, TFS_BS07);                         \
72                 BD_MIX(V, T, TFS_BS06); BD_MIX(E, Y, TFS_BS05);                         \
73                 BD_MIX(X, T, TFS_BS04); BD_MIX(V, W, TFS_BS03);                         \
74                 BD_MIX(E, N, TFS_BS02); BD_MIX(Z, Y, TFS_BS01);                         \
75                                                                                         \
76                 KD_MIX(N, V, k8 + x, k9 + k10, TFS_KS04);                               \
77                 KD_MIX(W, E, k5 + k6, k7, TFS_KS03);                                    \
78                 KD_MIX(T, Z, k3, k4, TFS_KS02); KD_MIX(Y, X, k1, k2, TFS_KS01);         \
79         } while (0)
80
81 #define PROCESS_BLOCKN(x,k1,k2,k3,k4,k5,k6,k7,k8,k9,k10)                                \
82         do {                                                                            \
83                 BD_MIX(E, T, TFS_BS24); BD_MIX(Z, W, TFS_BS23);                         \
84                 BD_MIX(X, N, TFS_BS22); BD_MIX(V, Y, TFS_BS21);                         \
85                 BD_MIX(Z, N, TFS_BS20); BD_MIX(X, W, TFS_BS19);                         \
86                 BD_MIX(V, T, TFS_BS18); BD_MIX(E, Y, TFS_BS17);                         \
87                 BD_MIX(X, T, TFS_BS16); BD_MIX(V, W, TFS_BS15);                         \
88                 BD_MIX(E, N, TFS_BS14); BD_MIX(Z, Y, TFS_BS13);                         \
89                                                                                         \
90                 KD_MIX(N, V, k8 + x, k9 + k10, TFS_KS08);                               \
91                 KD_MIX(W, E, k5 + k6, k7, TFS_KS07);                                    \
92                 KD_MIX(T, Z, k3, k4, TFS_KS06); KD_MIX(Y, X, k1, k2, TFS_KS05);         \
93         } while (0)
94
95 void tf_decrypt_rawblk(TF_UNIT_TYPE *O, const TF_UNIT_TYPE *I, const TF_UNIT_TYPE *K)
96 {
97         TF_UNIT_TYPE X, Y, Z, T;
98         TF_UNIT_TYPE E, W, V, N;
99         TF_UNIT_TYPE K0, K1, K2, K3;
100         TF_UNIT_TYPE K4, K5, K6, K7;
101         TF_UNIT_TYPE K8, T0, T1, T2;
102
103         X = I[0]; Y = I[1]; Z = I[2]; T = I[3];
104         E = I[4]; W = I[5]; V = I[6]; N = I[7];
105
106         K0 = K[ 0]; K1 = K[ 1]; K2 = K[ 2]; K3 = K[ 3];
107         K4 = K[ 4]; K5 = K[ 5]; K6 = K[ 6]; K7 = K[ 7];
108         K8 = K[ 8]; T0 = K[ 9]; T1 = K[10]; T2 = K[11];
109
110         X -= K0; Y -= K1; Z -= K2; T -= K3;
111         E -= K4; W -= K5 + T0; V -= K6 + T1; N -= K7 + 18;
112
113         PROCESS_BLOCKN(17,K0,K8,K2,K1,K4,T2,K3,K6,K5,T0);
114         PROCESS_BLOCKP(16,K8,K7,K1,K0,K3,T1,K2,K5,K4,T2);
115
116         PROCESS_BLOCKN(15,K7,K6,K0,K8,K2,T0,K1,K4,K3,T1);
117         PROCESS_BLOCKP(14,K6,K5,K8,K7,K1,T2,K0,K3,K2,T0);
118         PROCESS_BLOCKN(13,K5,K4,K7,K6,K0,T1,K8,K2,K1,T2);
119         PROCESS_BLOCKP(12,K4,K3,K6,K5,K8,T0,K7,K1,K0,T1);
120
121         PROCESS_BLOCKN(11,K3,K2,K5,K4,K7,T2,K6,K0,K8,T0);
122         PROCESS_BLOCKP(10,K2,K1,K4,K3,K6,T1,K5,K8,K7,T2);
123         PROCESS_BLOCKN( 9,K1,K0,K3,K2,K5,T0,K4,K7,K6,T1);
124         PROCESS_BLOCKP( 8,K0,K8,K2,K1,K4,T2,K3,K6,K5,T0);
125
126         PROCESS_BLOCKN( 7,K8,K7,K1,K0,K3,T1,K2,K5,K4,T2);
127         PROCESS_BLOCKP( 6,K7,K6,K0,K8,K2,T0,K1,K4,K3,T1);
128         PROCESS_BLOCKN( 5,K6,K5,K8,K7,K1,T2,K0,K3,K2,T0);
129         PROCESS_BLOCKP( 4,K5,K4,K7,K6,K0,T1,K8,K2,K1,T2);
130
131         PROCESS_BLOCKN( 3,K4,K3,K6,K5,K8,T0,K7,K1,K0,T1);
132         PROCESS_BLOCKP( 2,K3,K2,K5,K4,K7,T2,K6,K0,K8,T0);
133         PROCESS_BLOCKN( 1,K2,K1,K4,K3,K6,T1,K5,K8,K7,T2);
134         PROCESS_BLOCKP( 0,K1,K0,K3,K2,K5,T0,K4,K7,K6,T1);
135
136         O[0] = X; O[1] = Y; O[2] = Z; O[3] = T;
137         O[4] = E; O[5] = W; O[6] = V; O[7] = N;
138 }
139
140 #elif defined(TF_1024BITS)
141
142 #define PROCESS_BLOCKP(x,k1,k2,k3,k4,k5,k6,k7,k8,k9,k10,k11,k12,k13,k14,k15,k16,k17,k18)\
143         do {                                                                            \
144                 BD_MIX(A, N, TFS_BS24); BD_MIX(M, T, TFS_BS23);                         \
145                 BD_MIX(P, W, TFS_BS22); BD_MIX(H, Y, TFS_BS21);                         \
146                 BD_MIX(E, U, TFS_BS20); BD_MIX(V, B, TFS_BS19);                         \
147                 BD_MIX(Z, Q, TFS_BS18); BD_MIX(X, L, TFS_BS17);                         \
148                 BD_MIX(M, U, TFS_BS16); BD_MIX(P, Q, TFS_BS15);                         \
149                 BD_MIX(H, B, TFS_BS14); BD_MIX(A, L, TFS_BS13);                         \
150                 BD_MIX(V, Y, TFS_BS12); BD_MIX(E, T, TFS_BS11);                         \
151                 BD_MIX(Z, W, TFS_BS10); BD_MIX(X, N, TFS_BS09);                         \
152                 BD_MIX(P, Y, TFS_BS08); BD_MIX(H, W, TFS_BS07);                         \
153                 BD_MIX(A, T, TFS_BS06); BD_MIX(M, N, TFS_BS05);                         \
154                 BD_MIX(E, L, TFS_BS04); BD_MIX(V, Q, TFS_BS03);                         \
155                 BD_MIX(Z, B, TFS_BS02); BD_MIX(X, U, TFS_BS01);                         \
156                                                                                         \
157                 KD_MIX(L, H, k16 + x, k17 + k18, TFS_KS08);                             \
158                 KD_MIX(B, A, k13 + k14, k15, TFS_KS07);                                 \
159                 KD_MIX(Q, M, k11, k12, TFS_KS06); KD_MIX(U, P, k9, k10, TFS_KS05);      \
160                 KD_MIX(N, V, k7, k8, TFS_KS04); KD_MIX(W, E, k5, k6, TFS_KS03);         \
161                 KD_MIX(T, Z, k3, k4, TFS_KS02); KD_MIX(Y, X, k1, k2, TFS_KS01);         \
162         } while (0)
163
164 #define PROCESS_BLOCKN(x,k1,k2,k3,k4,k5,k6,k7,k8,k9,k10,k11,k12,k13,k14,k15,k16,k17,k18)\
165         do {                                                                            \
166                 BD_MIX(A, N, TFS_BS48); BD_MIX(M, T, TFS_BS47);                         \
167                 BD_MIX(P, W, TFS_BS46); BD_MIX(H, Y, TFS_BS45);                         \
168                 BD_MIX(E, U, TFS_BS44); BD_MIX(V, B, TFS_BS43);                         \
169                 BD_MIX(Z, Q, TFS_BS42); BD_MIX(X, L, TFS_BS41);                         \
170                 BD_MIX(M, U, TFS_BS40); BD_MIX(P, Q, TFS_BS39);                         \
171                 BD_MIX(H, B, TFS_BS38); BD_MIX(A, L, TFS_BS37);                         \
172                 BD_MIX(V, Y, TFS_BS36); BD_MIX(E, T, TFS_BS35);                         \
173                 BD_MIX(Z, W, TFS_BS34); BD_MIX(X, N, TFS_BS33);                         \
174                 BD_MIX(P, Y, TFS_BS32); BD_MIX(H, W, TFS_BS31);                         \
175                 BD_MIX(A, T, TFS_BS30); BD_MIX(M, N, TFS_BS29);                         \
176                 BD_MIX(E, L, TFS_BS28); BD_MIX(V, Q, TFS_BS27);                         \
177                 BD_MIX(Z, B, TFS_BS26); BD_MIX(X, U, TFS_BS25);                         \
178                                                                                         \
179                 KD_MIX(L, H, k16 + x, k17 + k18, TFS_KS16);                             \
180                 KD_MIX(B, A, k13 + k14, k15, TFS_KS15);                                 \
181                 KD_MIX(Q, M, k11, k12, TFS_KS14); KD_MIX(U, P, k9, k10, TFS_KS13);      \
182                 KD_MIX(N, V, k7, k8, TFS_KS12); KD_MIX(W, E, k5, k6, TFS_KS11);         \
183                 KD_MIX(T, Z, k3, k4, TFS_KS10); KD_MIX(Y, X, k1, k2, TFS_KS09);         \
184         } while (0)
185
186 void tf_decrypt_rawblk(TF_UNIT_TYPE *O, const TF_UNIT_TYPE *I, const TF_UNIT_TYPE *K)
187 {
188         TF_UNIT_TYPE X, Y, Z, T;
189         TF_UNIT_TYPE E, W, V, N;
190         TF_UNIT_TYPE P, U, M, Q;
191         TF_UNIT_TYPE A, B, H, L;
192         TF_UNIT_TYPE K0, K1, K2, K3;
193         TF_UNIT_TYPE K4, K5, K6, K7;
194         TF_UNIT_TYPE K8, K9, K10, K11;
195         TF_UNIT_TYPE K12, K13, K14, K15;
196         TF_UNIT_TYPE K16, T0, T1, T2;
197
198         X = I[ 0]; Y = I[ 1]; Z = I[ 2]; T = I[ 3];
199         E = I[ 4]; W = I[ 5]; V = I[ 6]; N = I[ 7];
200         P = I[ 8]; U = I[ 9]; M = I[10]; Q = I[11];
201         A = I[12]; B = I[13]; H = I[14]; L = I[15];
202
203         K0  = K[ 0]; K1  = K[ 1]; K2  = K[ 2]; K3  = K[ 3];
204         K4  = K[ 4]; K5  = K[ 5]; K6  = K[ 6]; K7  = K[ 7];
205         K8  = K[ 8]; K9  = K[ 9]; K10 = K[10]; K11 = K[11];
206         K12 = K[12]; K13 = K[13]; K14 = K[14]; K15 = K[15];
207         K16 = K[16]; T0  = K[17]; T1  = K[18]; T2  = K[19];
208
209         X -= K3; Y -= K4; Z -= K5; T -= K6;
210         E -= K7; W -= K8; V -= K9; N -= K10;
211         P -= K11; U -= K12; M -= K13; Q -= K14;
212         A -= K15; B -= K16 + T2; H -= K0 + T0; L -= K1 + 20;
213
214         PROCESS_BLOCKN(19, K3, K2, K5, K4, K7, K6, K9, K8,K11,K10,K13,K12,K15, T1,K14, K0,K16, T2);
215         PROCESS_BLOCKP(18, K2, K1, K4, K3, K6, K5, K8, K7,K10, K9,K12,K11,K14, T0,K13,K16,K15, T1);
216         PROCESS_BLOCKN(17, K1, K0, K3, K2, K5, K4, K7, K6, K9, K8,K11,K10,K13, T2,K12,K15,K14, T0);
217         PROCESS_BLOCKP(16, K0,K16, K2, K1, K4, K3, K6, K5, K8, K7,K10, K9,K12, T1,K11,K14,K13, T2);
218
219         PROCESS_BLOCKN(15,K16,K15, K1, K0, K3, K2, K5, K4, K7, K6, K9, K8,K11, T0,K10,K13,K12, T1);
220         PROCESS_BLOCKP(14,K15,K14, K0,K16, K2, K1, K4, K3, K6, K5, K8, K7,K10, T2, K9,K12,K11, T0);
221         PROCESS_BLOCKN(13,K14,K13,K16,K15, K1, K0, K3, K2, K5, K4, K7, K6, K9, T1, K8,K11,K10, T2);
222         PROCESS_BLOCKP(12,K13,K12,K15,K14, K0,K16, K2, K1, K4, K3, K6, K5, K8, T0, K7,K10, K9, T1);
223
224         PROCESS_BLOCKN(11,K12,K11,K14,K13,K16,K15, K1, K0, K3, K2, K5, K4, K7, T2, K6, K9, K8, T0);
225         PROCESS_BLOCKP(10,K11,K10,K13,K12,K15,K14, K0,K16, K2, K1, K4, K3, K6, T1, K5, K8, K7, T2);
226         PROCESS_BLOCKN( 9,K10, K9,K12,K11,K14,K13,K16,K15, K1, K0, K3, K2, K5, T0, K4, K7, K6, T1);
227         PROCESS_BLOCKP( 8, K9, K8,K11,K10,K13,K12,K15,K14, K0,K16, K2, K1, K4, T2, K3, K6, K5, T0);
228
229         PROCESS_BLOCKN( 7, K8, K7,K10, K9,K12,K11,K14,K13,K16,K15, K1, K0, K3, T1, K2, K5, K4, T2);
230         PROCESS_BLOCKP( 6, K7, K6, K9, K8,K11,K10,K13,K12,K15,K14, K0,K16, K2, T0, K1, K4, K3, T1);
231         PROCESS_BLOCKN( 5, K6, K5, K8, K7,K10, K9,K12,K11,K14,K13,K16,K15, K1, T2, K0, K3, K2, T0);
232         PROCESS_BLOCKP( 4, K5, K4, K7, K6, K9, K8,K11,K10,K13,K12,K15,K14, K0, T1,K16, K2, K1, T2);
233
234         PROCESS_BLOCKN( 3, K4, K3, K6, K5, K8, K7,K10, K9,K12,K11,K14,K13,K16, T0,K15, K1, K0, T1);
235         PROCESS_BLOCKP( 2, K3, K2, K5, K4, K7, K6, K9, K8,K11,K10,K13,K12,K15, T2,K14, K0,K16, T0);
236         PROCESS_BLOCKN( 1, K2, K1, K4, K3, K6, K5, K8, K7,K10, K9,K12,K11,K14, T1,K13,K16,K15, T2);
237         PROCESS_BLOCKP( 0, K1, K0, K3, K2, K5, K4, K7, K6, K9, K8,K11,K10,K13, T0,K12,K15,K14, T1);
238
239         O[0] = X; O[1] = Y; O[2] = Z; O[3] = T;
240         O[4] = E; O[5] = W; O[6] = V; O[7] = N;
241         O[8] = P; O[9] = U; O[10] = M; O[11] = Q;
242         O[12] = A; O[13] = B; O[14] = H; O[15] = L;
243 }
244
245 #endif