4 #if defined(TF_256BITS)
6 #define PROCESS_BLOCKP(x,k1,k2,k3,k4,k5,k6) \
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); \
12 KD_MIX(T, Z, k4 + x, k5 + k6, TFS_KS02); \
13 KD_MIX(Y, X, k1 + k2, k3, TFS_KS01); \
16 #define PROCESS_BLOCKN(x,k1,k2,k3,k4,k5,k6) \
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); \
22 KD_MIX(T, Z, k4 + x, k5 + k6, TFS_KS04); \
23 KD_MIX(Y, X, k1 + k2, k3, TFS_KS03); \
26 void tf_decrypt_rawblk(TF_UNIT_TYPE *O, const TF_UNIT_TYPE *I, const TF_UNIT_TYPE *K)
28 TF_UNIT_TYPE X, Y, Z, T;
29 TF_UNIT_TYPE K0, K1, K2, K3;
30 TF_UNIT_TYPE K4, T0, T1, T2;
32 X = I[0]; Y = I[1]; Z = I[2]; T = I[3];
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];
37 X -= K3; Y -= K4 + T0; Z -= K0 + T1; T -= K1 + 18;
39 PROCESS_BLOCKN(17,K3,T2,K2,K0,K4,T0);
40 PROCESS_BLOCKP(16,K2,T1,K1,K4,K3,T2);
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);
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);
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);
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);
62 O[0] = X; O[1] = Y; O[2] = Z; O[3] = T;
65 #elif defined(TF_512BITS)
67 #define PROCESS_BLOCKP(x,k1,k2,k3,k4,k5,k6,k7,k8,k9,k10) \
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); \
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); \
81 #define PROCESS_BLOCKN(x,k1,k2,k3,k4,k5,k6,k7,k8,k9,k10) \
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); \
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); \
95 void tf_decrypt_rawblk(TF_UNIT_TYPE *O, const TF_UNIT_TYPE *I, const TF_UNIT_TYPE *K)
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;
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];
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];
110 X -= K0; Y -= K1; Z -= K2; T -= K3;
111 E -= K4; W -= K5 + T0; V -= K6 + T1; N -= K7 + 18;
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);
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);
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);
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);
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);
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;
140 #elif defined(TF_1024BITS)
142 #define PROCESS_BLOCKP(x,k1,k2,k3,k4,k5,k6,k7,k8,k9,k10,k11,k12,k13,k14,k15,k16,k17,k18)\
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); \
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); \
164 #define PROCESS_BLOCKN(x,k1,k2,k3,k4,k5,k6,k7,k8,k9,k10,k11,k12,k13,k14,k15,k16,k17,k18)\
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); \
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); \
186 void tf_decrypt_rawblk(TF_UNIT_TYPE *O, const TF_UNIT_TYPE *I, const TF_UNIT_TYPE *K)
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;
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];
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];
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;
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);
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);
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);
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);
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);
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;