3cc869cae2cc6b44c9b217e00c4a9ae25850a3e3
[hashcat.git] / src / rp_kernel_on_cpu.c
1 /**
2 * Author......: Jens Steube <jens.steube@gmail.com>
3 * License.....: MIT
4 */
5
6 #pragma GCC diagnostic ignored "-Wunused-parameter"
7 #pragma GCC diagnostic ignored "-Wunused-function"
8
9 #include <rp_kernel_on_cpu.h>
10
11 static u32 generate_cmask (u32 buf)
12 {
13 const u32 rmask = ((buf & 0x40404040) >> 1)
14 & ~((buf & 0x80808080) >> 2);
15
16 const u32 hmask = (buf & 0x1f1f1f1f) + 0x05050505;
17 const u32 lmask = (buf & 0x1f1f1f1f) + 0x1f1f1f1f;
18
19 return rmask & ~hmask & lmask;
20 }
21
22 static void truncate_right (u32 w0[4], u32 w1[4], const u32 len)
23 {
24 const u32 tmp = (1 << ((len % 4) * 8)) - 1;
25
26 switch (len / 4)
27 {
28 case 0: w0[0] &= tmp;
29 w0[1] = 0;
30 w0[2] = 0;
31 w0[3] = 0;
32 w1[0] = 0;
33 w1[1] = 0;
34 w1[2] = 0;
35 w1[3] = 0;
36 break;
37 case 1: w0[1] &= tmp;
38 w0[2] = 0;
39 w0[3] = 0;
40 w1[0] = 0;
41 w1[1] = 0;
42 w1[2] = 0;
43 w1[3] = 0;
44 break;
45 case 2: w0[2] &= tmp;
46 w0[3] = 0;
47 w1[0] = 0;
48 w1[1] = 0;
49 w1[2] = 0;
50 w1[3] = 0;
51 break;
52 case 3: w0[3] &= tmp;
53 w1[0] = 0;
54 w1[1] = 0;
55 w1[2] = 0;
56 w1[3] = 0;
57 break;
58 case 4: w1[0] &= tmp;
59 w1[1] = 0;
60 w1[2] = 0;
61 w1[3] = 0;
62 break;
63 case 5: w1[1] &= tmp;
64 w1[2] = 0;
65 w1[3] = 0;
66 break;
67 case 6: w1[2] &= tmp;
68 w1[3] = 0;
69 break;
70 case 7: w1[3] &= tmp;
71 break;
72 }
73 }
74
75 static void truncate_left (u32 w0[4], u32 w1[4], const u32 len)
76 {
77 const u32 tmp = ~((1 << ((len % 4) * 8)) - 1);
78
79 switch (len / 4)
80 {
81 case 0: w0[0] &= tmp;
82 break;
83 case 1: w0[0] = 0;
84 w0[1] &= tmp;
85 break;
86 case 2: w0[0] = 0;
87 w0[1] = 0;
88 w0[2] &= tmp;
89 break;
90 case 3: w0[0] = 0;
91 w0[1] = 0;
92 w0[2] = 0;
93 w0[3] &= tmp;
94 break;
95 case 4: w0[0] = 0;
96 w0[1] = 0;
97 w0[2] = 0;
98 w0[3] = 0;
99 w1[0] &= tmp;
100 break;
101 case 5: w0[0] = 0;
102 w0[1] = 0;
103 w0[2] = 0;
104 w0[3] = 0;
105 w1[0] = 0;
106 w1[1] &= tmp;
107 break;
108 case 6: w0[0] = 0;
109 w0[1] = 0;
110 w0[2] = 0;
111 w0[3] = 0;
112 w1[0] = 0;
113 w1[1] = 0;
114 w1[2] &= tmp;
115 break;
116 case 7: w0[0] = 0;
117 w0[1] = 0;
118 w0[2] = 0;
119 w0[3] = 0;
120 w1[0] = 0;
121 w1[1] = 0;
122 w1[2] = 0;
123 w1[3] &= tmp;
124 break;
125 }
126 }
127
128 static void lshift_block (const u32 in0[4], const u32 in1[4], u32 out0[4], u32 out1[4])
129 {
130 out0[0] = in0[0] >> 8 | in0[1] << 24;
131 out0[1] = in0[1] >> 8 | in0[2] << 24;
132 out0[2] = in0[2] >> 8 | in0[3] << 24;
133 out0[3] = in0[3] >> 8 | in1[0] << 24;
134 out1[0] = in1[0] >> 8 | in1[1] << 24;
135 out1[1] = in1[1] >> 8 | in1[2] << 24;
136 out1[2] = in1[2] >> 8 | in1[3] << 24;
137 out1[3] = in1[3] >> 8;
138 }
139
140 static void rshift_block (const u32 in0[4], const u32 in1[4], u32 out0[4], u32 out1[4])
141 {
142 out1[3] = in1[3] << 8 | in1[2] >> 24;
143 out1[2] = in1[2] << 8 | in1[1] >> 24;
144 out1[1] = in1[1] << 8 | in1[0] >> 24;
145 out1[0] = in1[0] << 8 | in0[3] >> 24;
146 out0[3] = in0[3] << 8 | in0[2] >> 24;
147 out0[2] = in0[2] << 8 | in0[1] >> 24;
148 out0[1] = in0[1] << 8 | in0[0] >> 24;
149 out0[0] = in0[0] << 8;
150 }
151
152 static void rshift_block_N (const u32 in0[4], const u32 in1[4], u32 out0[4], u32 out1[4], const u32 num)
153 {
154 switch (num)
155 {
156 case 0: out1[3] = in1[3];
157 out1[2] = in1[2];
158 out1[1] = in1[1];
159 out1[0] = in1[0];
160 out0[3] = in0[3];
161 out0[2] = in0[2];
162 out0[1] = in0[1];
163 out0[0] = in0[0];
164 break;
165 case 1: out1[3] = in1[3] << 8 | in1[2] >> 24;
166 out1[2] = in1[2] << 8 | in1[1] >> 24;
167 out1[1] = in1[1] << 8 | in1[0] >> 24;
168 out1[0] = in1[0] << 8 | in0[3] >> 24;
169 out0[3] = in0[3] << 8 | in0[2] >> 24;
170 out0[2] = in0[2] << 8 | in0[1] >> 24;
171 out0[1] = in0[1] << 8 | in0[0] >> 24;
172 out0[0] = in0[0] << 8;
173 break;
174 case 2: out1[3] = in1[3] << 16 | in1[2] >> 16;
175 out1[2] = in1[2] << 16 | in1[1] >> 16;
176 out1[1] = in1[1] << 16 | in1[0] >> 16;
177 out1[0] = in1[0] << 16 | in0[3] >> 16;
178 out0[3] = in0[3] << 16 | in0[2] >> 16;
179 out0[2] = in0[2] << 16 | in0[1] >> 16;
180 out0[1] = in0[1] << 16 | in0[0] >> 16;
181 out0[0] = in0[0] << 16;
182 break;
183 case 3: out1[3] = in1[3] << 24 | in1[2] >> 8;
184 out1[2] = in1[2] << 24 | in1[1] >> 8;
185 out1[1] = in1[1] << 24 | in1[0] >> 8;
186 out1[0] = in1[0] << 24 | in0[3] >> 8;
187 out0[3] = in0[3] << 24 | in0[2] >> 8;
188 out0[2] = in0[2] << 24 | in0[1] >> 8;
189 out0[1] = in0[1] << 24 | in0[0] >> 8;
190 out0[0] = in0[0] << 24;
191 break;
192 case 4: out1[3] = in1[2];
193 out1[2] = in1[1];
194 out1[1] = in1[0];
195 out1[0] = in0[3];
196 out0[3] = in0[2];
197 out0[2] = in0[1];
198 out0[1] = in0[0];
199 out0[0] = 0;
200 break;
201 case 5: out1[3] = in1[2] << 8 | in1[1] >> 24;
202 out1[2] = in1[1] << 8 | in1[0] >> 24;
203 out1[1] = in1[0] << 8 | in0[3] >> 24;
204 out1[0] = in0[3] << 8 | in0[2] >> 24;
205 out0[3] = in0[2] << 8 | in0[1] >> 24;
206 out0[2] = in0[1] << 8 | in0[0] >> 24;
207 out0[1] = in0[0] << 8;
208 out0[0] = 0;
209 break;
210 case 6: out1[3] = in1[2] << 16 | in1[1] >> 16;
211 out1[2] = in1[1] << 16 | in1[0] >> 16;
212 out1[1] = in1[0] << 16 | in0[3] >> 16;
213 out1[0] = in0[3] << 16 | in0[2] >> 16;
214 out0[3] = in0[2] << 16 | in0[1] >> 16;
215 out0[2] = in0[1] << 16 | in0[0] >> 16;
216 out0[1] = in0[0] << 16;
217 out0[0] = 0;
218 break;
219 case 7: out1[3] = in1[2] << 24 | in1[1] >> 8;
220 out1[2] = in1[1] << 24 | in1[0] >> 8;
221 out1[1] = in1[0] << 24 | in0[3] >> 8;
222 out1[0] = in0[3] << 24 | in0[2] >> 8;
223 out0[3] = in0[2] << 24 | in0[1] >> 8;
224 out0[2] = in0[1] << 24 | in0[0] >> 8;
225 out0[1] = in0[0] << 24;
226 out0[0] = 0;
227 break;
228 case 8: out1[3] = in1[1];
229 out1[2] = in1[0];
230 out1[1] = in0[3];
231 out1[0] = in0[2];
232 out0[3] = in0[1];
233 out0[2] = in0[0];
234 out0[1] = 0;
235 out0[0] = 0;
236 break;
237 case 9: out1[3] = in1[1] << 8 | in1[0] >> 24;
238 out1[2] = in1[0] << 8 | in0[3] >> 24;
239 out1[1] = in0[3] << 8 | in0[2] >> 24;
240 out1[0] = in0[2] << 8 | in0[1] >> 24;
241 out0[3] = in0[1] << 8 | in0[0] >> 24;
242 out0[2] = in0[0] << 8;
243 out0[1] = 0;
244 out0[0] = 0;
245 break;
246 case 10: out1[3] = in1[1] << 16 | in1[0] >> 16;
247 out1[2] = in1[0] << 16 | in0[3] >> 16;
248 out1[1] = in0[3] << 16 | in0[2] >> 16;
249 out1[0] = in0[2] << 16 | in0[1] >> 16;
250 out0[3] = in0[1] << 16 | in0[0] >> 16;
251 out0[2] = in0[0] << 16;
252 out0[1] = 0;
253 out0[0] = 0;
254 break;
255 case 11: out1[3] = in1[1] << 24 | in1[0] >> 8;
256 out1[2] = in1[0] << 24 | in0[3] >> 8;
257 out1[1] = in0[3] << 24 | in0[2] >> 8;
258 out1[0] = in0[2] << 24 | in0[1] >> 8;
259 out0[3] = in0[1] << 24 | in0[0] >> 8;
260 out0[2] = in0[0] << 24;
261 out0[1] = 0;
262 out0[0] = 0;
263 break;
264 case 12: out1[3] = in1[0];
265 out1[2] = in0[3];
266 out1[1] = in0[2];
267 out1[0] = in0[1];
268 out0[3] = in0[0];
269 out0[2] = 0;
270 out0[1] = 0;
271 out0[0] = 0;
272 break;
273 case 13: out1[3] = in1[0] << 8 | in0[3] >> 24;
274 out1[2] = in0[3] << 8 | in0[2] >> 24;
275 out1[1] = in0[2] << 8 | in0[1] >> 24;
276 out1[0] = in0[1] << 8 | in0[0] >> 24;
277 out0[3] = in0[0] << 8;
278 out0[2] = 0;
279 out0[1] = 0;
280 out0[0] = 0;
281 break;
282 case 14: out1[3] = in1[0] << 16 | in0[3] >> 16;
283 out1[2] = in0[3] << 16 | in0[2] >> 16;
284 out1[1] = in0[2] << 16 | in0[1] >> 16;
285 out1[0] = in0[1] << 16 | in0[0] >> 16;
286 out0[3] = in0[0] << 16;
287 out0[2] = 0;
288 out0[1] = 0;
289 out0[0] = 0;
290 break;
291 case 15: out1[3] = in1[0] << 24 | in0[3] >> 8;
292 out1[2] = in0[3] << 24 | in0[2] >> 8;
293 out1[1] = in0[2] << 24 | in0[1] >> 8;
294 out1[0] = in0[1] << 24 | in0[0] >> 8;
295 out0[3] = in0[0] << 24;
296 out0[2] = 0;
297 out0[1] = 0;
298 out0[0] = 0;
299 break;
300 case 16: out1[3] = in0[3];
301 out1[2] = in0[2];
302 out1[1] = in0[1];
303 out1[0] = in0[0];
304 out0[3] = 0;
305 out0[2] = 0;
306 out0[1] = 0;
307 out0[0] = 0;
308 break;
309 case 17: out1[3] = in0[3] << 8 | in0[2] >> 24;
310 out1[2] = in0[2] << 8 | in0[1] >> 24;
311 out1[1] = in0[1] << 8 | in0[0] >> 24;
312 out1[0] = in0[0] << 8;
313 out0[3] = 0;
314 out0[2] = 0;
315 out0[1] = 0;
316 out0[0] = 0;
317 break;
318 case 18: out1[3] = in0[3] << 16 | in0[2] >> 16;
319 out1[2] = in0[2] << 16 | in0[1] >> 16;
320 out1[1] = in0[1] << 16 | in0[0] >> 16;
321 out1[0] = in0[0] << 16;
322 out0[3] = 0;
323 out0[2] = 0;
324 out0[1] = 0;
325 out0[0] = 0;
326 break;
327 case 19: out1[3] = in0[3] << 24 | in0[2] >> 8;
328 out1[2] = in0[2] << 24 | in0[1] >> 8;
329 out1[1] = in0[1] << 24 | in0[0] >> 8;
330 out1[0] = in0[0] << 24;
331 out0[3] = 0;
332 out0[2] = 0;
333 out0[1] = 0;
334 out0[0] = 0;
335 break;
336 case 20: out1[3] = in0[2];
337 out1[2] = in0[1];
338 out1[1] = in0[0];
339 out1[0] = 0;
340 out0[3] = 0;
341 out0[2] = 0;
342 out0[1] = 0;
343 out0[0] = 0;
344 break;
345 case 21: out1[3] = in0[2] << 8 | in0[1] >> 24;
346 out1[2] = in0[1] << 8 | in0[0] >> 24;
347 out1[1] = in0[0] << 8;
348 out1[0] = 0;
349 out0[3] = 0;
350 out0[2] = 0;
351 out0[1] = 0;
352 out0[0] = 0;
353 break;
354 case 22: out1[3] = in0[2] << 16 | in0[1] >> 16;
355 out1[2] = in0[1] << 16 | in0[0] >> 16;
356 out1[1] = in0[0] << 16;
357 out1[0] = 0;
358 out0[3] = 0;
359 out0[2] = 0;
360 out0[1] = 0;
361 out0[0] = 0;
362 break;
363 case 23: out1[3] = in0[2] << 24 | in0[1] >> 8;
364 out1[2] = in0[1] << 24 | in0[0] >> 8;
365 out1[1] = in0[0] << 24;
366 out1[0] = 0;
367 out0[3] = 0;
368 out0[2] = 0;
369 out0[1] = 0;
370 out0[0] = 0;
371 break;
372 case 24: out1[3] = in0[1];
373 out1[2] = in0[0];
374 out1[1] = 0;
375 out1[0] = 0;
376 out0[3] = 0;
377 out0[2] = 0;
378 out0[1] = 0;
379 out0[0] = 0;
380 break;
381 case 25: out1[3] = in0[1] << 8 | in0[0] >> 24;
382 out1[2] = in0[0] << 8;
383 out1[1] = 0;
384 out1[0] = 0;
385 out0[3] = 0;
386 out0[2] = 0;
387 out0[1] = 0;
388 out0[0] = 0;
389 break;
390 case 26: out1[3] = in0[1] << 16 | in0[0] >> 16;
391 out1[2] = in0[0] << 16;
392 out1[1] = 0;
393 out1[0] = 0;
394 out0[3] = 0;
395 out0[2] = 0;
396 out0[1] = 0;
397 out0[0] = 0;
398 break;
399 case 27: out1[3] = in0[1] << 24 | in0[0] >> 8;
400 out1[2] = in0[0] << 24;
401 out1[1] = 0;
402 out1[0] = 0;
403 out0[3] = 0;
404 out0[2] = 0;
405 out0[1] = 0;
406 out0[0] = 0;
407 break;
408 case 28: out1[3] = in0[0];
409 out1[2] = 0;
410 out1[1] = 0;
411 out1[0] = 0;
412 out0[3] = 0;
413 out0[2] = 0;
414 out0[1] = 0;
415 out0[0] = 0;
416 break;
417 case 29: out1[3] = in0[0] << 8;
418 out1[2] = 0;
419 out1[1] = 0;
420 out1[0] = 0;
421 out0[3] = 0;
422 out0[2] = 0;
423 out0[1] = 0;
424 out0[0] = 0;
425 break;
426 case 30: out1[3] = in0[0] << 16;
427 out1[2] = 0;
428 out1[1] = 0;
429 out1[0] = 0;
430 out0[3] = 0;
431 out0[2] = 0;
432 out0[1] = 0;
433 out0[0] = 0;
434 break;
435 case 31: out1[3] = in0[0] << 24;
436 out1[2] = 0;
437 out1[1] = 0;
438 out1[0] = 0;
439 out0[3] = 0;
440 out0[2] = 0;
441 out0[1] = 0;
442 out0[0] = 0;
443 break;
444 }
445 }
446
447 static void lshift_block_N (const u32 in0[4], const u32 in1[4], u32 out0[4], u32 out1[4], const u32 num)
448 {
449 switch (num)
450 {
451 case 0: out0[0] = in0[0];
452 out0[1] = in0[1];
453 out0[2] = in0[2];
454 out0[3] = in0[3];
455 out1[0] = in1[0];
456 out1[1] = in1[1];
457 out1[2] = in1[2];
458 out1[3] = in1[3];
459 break;
460 case 1: out0[0] = in0[0] >> 8 | in0[1] << 24;
461 out0[1] = in0[1] >> 8 | in0[2] << 24;
462 out0[2] = in0[2] >> 8 | in0[3] << 24;
463 out0[3] = in0[3] >> 8 | in1[0] << 24;
464 out1[0] = in1[0] >> 8 | in1[1] << 24;
465 out1[1] = in1[1] >> 8 | in1[2] << 24;
466 out1[2] = in1[2] >> 8 | in1[3] << 24;
467 out1[3] = in1[3] >> 8;
468 break;
469 case 2: out0[0] = in0[0] >> 16 | in0[1] << 16;
470 out0[1] = in0[1] >> 16 | in0[2] << 16;
471 out0[2] = in0[2] >> 16 | in0[3] << 16;
472 out0[3] = in0[3] >> 16 | in1[0] << 16;
473 out1[0] = in1[0] >> 16 | in1[1] << 16;
474 out1[1] = in1[1] >> 16 | in1[2] << 16;
475 out1[2] = in1[2] >> 16 | in1[3] << 16;
476 out1[3] = in1[3] >> 16;
477 break;
478 case 3: out0[0] = in0[0] >> 24 | in0[1] << 8;
479 out0[1] = in0[1] >> 24 | in0[2] << 8;
480 out0[2] = in0[2] >> 24 | in0[3] << 8;
481 out0[3] = in0[3] >> 24 | in1[0] << 8;
482 out1[0] = in1[0] >> 24 | in1[1] << 8;
483 out1[1] = in1[1] >> 24 | in1[2] << 8;
484 out1[2] = in1[2] >> 24 | in1[3] << 8;
485 out1[3] = in1[3] >> 24;
486 break;
487 case 4: out0[0] = in0[1];
488 out0[1] = in0[2];
489 out0[2] = in0[3];
490 out0[3] = in1[0];
491 out1[0] = in1[1];
492 out1[1] = in1[2];
493 out1[2] = in1[3];
494 out1[3] = 0;
495 break;
496 case 5: out0[0] = in0[1] >> 8 | in0[2] << 24;
497 out0[1] = in0[2] >> 8 | in0[3] << 24;
498 out0[2] = in0[3] >> 8 | in1[0] << 24;
499 out0[3] = in1[0] >> 8 | in1[1] << 24;
500 out1[0] = in1[1] >> 8 | in1[2] << 24;
501 out1[1] = in1[2] >> 8 | in1[3] << 24;
502 out1[2] = in1[3] >> 8;
503 out1[3] = 0;
504 break;
505 case 6: out0[0] = in0[1] >> 16 | in0[2] << 16;
506 out0[1] = in0[2] >> 16 | in0[3] << 16;
507 out0[2] = in0[3] >> 16 | in1[0] << 16;
508 out0[3] = in1[0] >> 16 | in1[1] << 16;
509 out1[0] = in1[1] >> 16 | in1[2] << 16;
510 out1[1] = in1[2] >> 16 | in1[3] << 16;
511 out1[2] = in1[3] >> 16;
512 out1[3] = 0;
513 break;
514 case 7: out0[0] = in0[1] >> 24 | in0[2] << 8;
515 out0[1] = in0[2] >> 24 | in0[3] << 8;
516 out0[2] = in0[3] >> 24 | in1[0] << 8;
517 out0[3] = in1[0] >> 24 | in1[1] << 8;
518 out1[0] = in1[1] >> 24 | in1[2] << 8;
519 out1[1] = in1[2] >> 24 | in1[3] << 8;
520 out1[2] = in1[3] >> 24;
521 out1[3] = 0;
522 break;
523 case 8: out0[0] = in0[2];
524 out0[1] = in0[3];
525 out0[2] = in1[0];
526 out0[3] = in1[1];
527 out1[0] = in1[2];
528 out1[1] = in1[3];
529 out1[2] = 0;
530 out1[3] = 0;
531 break;
532 case 9: out0[0] = in0[2] >> 8 | in0[3] << 24;
533 out0[1] = in0[3] >> 8 | in1[0] << 24;
534 out0[2] = in1[0] >> 8 | in1[1] << 24;
535 out0[3] = in1[1] >> 8 | in1[2] << 24;
536 out1[0] = in1[2] >> 8 | in1[3] << 24;
537 out1[1] = in1[3] >> 8;
538 out1[2] = 0;
539 out1[3] = 0;
540 break;
541 case 10: out0[0] = in0[2] >> 16 | in0[3] << 16;
542 out0[1] = in0[3] >> 16 | in1[0] << 16;
543 out0[2] = in1[0] >> 16 | in1[1] << 16;
544 out0[3] = in1[1] >> 16 | in1[2] << 16;
545 out1[0] = in1[2] >> 16 | in1[3] << 16;
546 out1[1] = in1[3] >> 16;
547 out1[2] = 0;
548 out1[3] = 0;
549 break;
550 case 11: out0[0] = in0[2] >> 24 | in0[3] << 8;
551 out0[1] = in0[3] >> 24 | in1[0] << 8;
552 out0[2] = in1[0] >> 24 | in1[1] << 8;
553 out0[3] = in1[1] >> 24 | in1[2] << 8;
554 out1[0] = in1[2] >> 24 | in1[3] << 8;
555 out1[1] = in1[3] >> 24;
556 out1[2] = 0;
557 out1[3] = 0;
558 break;
559 case 12: out0[0] = in0[3];
560 out0[1] = in1[0];
561 out0[2] = in1[1];
562 out0[3] = in1[2];
563 out1[0] = in1[3];
564 out1[1] = 0;
565 out1[2] = 0;
566 out1[3] = 0;
567 break;
568 case 13:
569 out0[0] = in0[3] >> 8 | in1[0] << 24;
570 out0[1] = in1[0] >> 8 | in1[1] << 24;
571 out0[2] = in1[1] >> 8 | in1[2] << 24;
572 out0[3] = in1[2] >> 8 | in1[3] << 24;
573 out1[0] = in1[3] >> 8;
574 out1[1] = 0;
575 out1[2] = 0;
576 out1[3] = 0;
577 break;
578 case 14: out0[0] = in0[3] >> 16 | in1[0] << 16;
579 out0[1] = in1[0] >> 16 | in1[1] << 16;
580 out0[2] = in1[1] >> 16 | in1[2] << 16;
581 out0[3] = in1[2] >> 16 | in1[3] << 16;
582 out1[0] = in1[3] >> 16;
583 out1[1] = 0;
584 out1[2] = 0;
585 out1[3] = 0;
586 break;
587 case 15: out0[0] = in0[3] >> 24 | in1[0] << 8;
588 out0[1] = in1[0] >> 24 | in1[1] << 8;
589 out0[2] = in1[1] >> 24 | in1[2] << 8;
590 out0[3] = in1[2] >> 24 | in1[3] << 8;
591 out1[0] = in1[3] >> 24;
592 out1[1] = 0;
593 out1[2] = 0;
594 out1[3] = 0;
595 break;
596 case 16: out0[0] = in1[0];
597 out0[1] = in1[1];
598 out0[2] = in1[2];
599 out0[3] = in1[3];
600 out1[0] = 0;
601 out1[1] = 0;
602 out1[2] = 0;
603 out1[3] = 0;
604 break;
605 case 17: out0[0] = in1[0] >> 8 | in1[1] << 24;
606 out0[1] = in1[1] >> 8 | in1[2] << 24;
607 out0[2] = in1[2] >> 8 | in1[3] << 24;
608 out0[3] = in1[3] >> 8;
609 out1[0] = 0;
610 out1[1] = 0;
611 out1[2] = 0;
612 out1[3] = 0;
613 break;
614 case 18: out0[0] = in1[0] >> 16 | in1[1] << 16;
615 out0[1] = in1[1] >> 16 | in1[2] << 16;
616 out0[2] = in1[2] >> 16 | in1[3] << 16;
617 out0[3] = in1[3] >> 16;
618 out1[0] = 0;
619 out1[1] = 0;
620 out1[2] = 0;
621 out1[3] = 0;
622 break;
623 case 19: out0[0] = in1[0] >> 24 | in1[1] << 8;
624 out0[1] = in1[1] >> 24 | in1[2] << 8;
625 out0[2] = in1[2] >> 24 | in1[3] << 8;
626 out0[3] = in1[3] >> 24;
627 out1[0] = 0;
628 out1[1] = 0;
629 out1[2] = 0;
630 out1[3] = 0;
631 break;
632 case 20: out0[0] = in1[1];
633 out0[1] = in1[2];
634 out0[2] = in1[3];
635 out0[3] = 0;
636 out1[0] = 0;
637 out1[1] = 0;
638 out1[2] = 0;
639 out1[3] = 0;
640 break;
641 case 21: out0[0] = in1[1] >> 8 | in1[2] << 24;
642 out0[1] = in1[2] >> 8 | in1[3] << 24;
643 out0[2] = in1[3] >> 8;
644 out0[3] = 0;
645 out1[0] = 0;
646 out1[1] = 0;
647 out1[2] = 0;
648 out1[3] = 0;
649 break;
650 case 22: out0[0] = in1[1] >> 16 | in1[2] << 16;
651 out0[1] = in1[2] >> 16 | in1[3] << 16;
652 out0[2] = in1[3] >> 16;
653 out0[3] = 0;
654 out1[0] = 0;
655 out1[1] = 0;
656 out1[2] = 0;
657 out1[3] = 0;
658 break;
659 case 23: out0[0] = in1[1] >> 24 | in1[2] << 8;
660 out0[1] = in1[2] >> 24 | in1[3] << 8;
661 out0[2] = in1[3] >> 24;
662 out0[3] = 0;
663 out1[0] = 0;
664 out1[1] = 0;
665 out1[2] = 0;
666 out1[3] = 0;
667 break;
668 case 24: out0[0] = in1[2];
669 out0[1] = in1[3];
670 out0[2] = 0;
671 out0[3] = 0;
672 out1[0] = 0;
673 out1[1] = 0;
674 out1[2] = 0;
675 out1[3] = 0;
676 break;
677 case 25: out0[0] = in1[2] >> 8 | in1[3] << 24;
678 out0[1] = in1[3] >> 8;
679 out0[2] = 0;
680 out0[3] = 0;
681 out1[0] = 0;
682 out1[1] = 0;
683 out1[2] = 0;
684 out1[3] = 0;
685 break;
686 case 26: out0[0] = in1[2] >> 16 | in1[3] << 16;
687 out0[1] = in1[3] >> 16;
688 out0[2] = 0;
689 out0[3] = 0;
690 out1[0] = 0;
691 out1[1] = 0;
692 out1[2] = 0;
693 out1[3] = 0;
694 break;
695 case 27: out0[0] = in1[2] >> 24 | in1[3] << 8;
696 out0[1] = in1[3] >> 24;
697 out0[2] = 0;
698 out0[3] = 0;
699 out1[0] = 0;
700 out1[1] = 0;
701 out1[2] = 0;
702 out1[3] = 0;
703 break;
704 case 28: out0[0] = in1[3];
705 out0[1] = 0;
706 out0[2] = 0;
707 out0[3] = 0;
708 out1[0] = 0;
709 out1[1] = 0;
710 out1[2] = 0;
711 out1[3] = 0;
712 break;
713 case 29: out0[0] = in1[3] >> 8;
714 out0[1] = 0;
715 out0[2] = 0;
716 out0[3] = 0;
717 out1[0] = 0;
718 out1[1] = 0;
719 out1[2] = 0;
720 out1[3] = 0;
721 break;
722 case 30: out0[0] = in1[3] >> 16;
723 out0[1] = 0;
724 out0[2] = 0;
725 out0[3] = 0;
726 out1[0] = 0;
727 out1[1] = 0;
728 out1[2] = 0;
729 out1[3] = 0;
730 break;
731 case 31: out0[0] = in1[3] >> 24;
732 out0[1] = 0;
733 out0[2] = 0;
734 out0[3] = 0;
735 out1[0] = 0;
736 out1[1] = 0;
737 out1[2] = 0;
738 out1[3] = 0;
739 break;
740 }
741 }
742
743 static void append_block1 (const u32 offset, u32 dst0[4], u32 dst1[4], const u32 src_r0)
744 {
745 u32 tmp[2] = { 0 };
746
747 switch (offset & 3)
748 {
749 case 0: tmp[0] = src_r0;
750 tmp[1] = 0;
751 break;
752 case 1: tmp[0] = src_r0 << 8;
753 tmp[1] = src_r0 >> 24;
754 break;
755 case 2: tmp[0] = src_r0 << 16;
756 tmp[1] = src_r0 >> 16;
757 break;
758 case 3: tmp[0] = src_r0 << 24;
759 tmp[1] = src_r0 >> 8;
760 break;
761 }
762
763 switch (offset / 4)
764 {
765 case 0: dst0[0] |= tmp[0];
766 dst0[1] = tmp[1];
767 break;
768 case 1: dst0[1] |= tmp[0];
769 dst0[2] = tmp[1];
770 break;
771 case 2: dst0[2] |= tmp[0];
772 dst0[3] = tmp[1];
773 break;
774 case 3: dst0[3] |= tmp[0];
775 dst1[0] = tmp[1];
776 break;
777 case 4: dst1[0] |= tmp[0];
778 dst1[1] = tmp[1];
779 break;
780 case 5: dst1[1] |= tmp[0];
781 dst1[2] = tmp[1];
782 break;
783 case 6: dst1[2] |= tmp[0];
784 dst1[3] = tmp[1];
785 break;
786 case 7: dst1[3] |= tmp[0];
787 break;
788 }
789 }
790
791 static void append_block8 (const u32 offset, u32 dst0[4], u32 dst1[4], const u32 src_l0[4], const u32 src_l1[4], const u32 src_r0[4], const u32 src_r1[4])
792 {
793 switch (offset)
794 {
795 case 0:
796 dst0[0] = src_r0[0];
797 dst0[1] = src_r0[1];
798 dst0[2] = src_r0[2];
799 dst0[3] = src_r0[3];
800 dst1[0] = src_r1[0];
801 dst1[1] = src_r1[1];
802 dst1[2] = src_r1[2];
803 dst1[3] = src_r1[3];
804 break;
805
806 case 1:
807 dst0[0] = src_l0[0] | src_r0[0] << 8;
808 dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8;
809 dst0[2] = src_r0[1] >> 24 | src_r0[2] << 8;
810 dst0[3] = src_r0[2] >> 24 | src_r0[3] << 8;
811 dst1[0] = src_r0[3] >> 24 | src_r1[0] << 8;
812 dst1[1] = src_r1[0] >> 24 | src_r1[1] << 8;
813 dst1[2] = src_r1[1] >> 24 | src_r1[2] << 8;
814 dst1[3] = src_r1[2] >> 24 | src_r1[3] << 8;
815 break;
816
817 case 2:
818 dst0[0] = src_l0[0] | src_r0[0] << 16;
819 dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16;
820 dst0[2] = src_r0[1] >> 16 | src_r0[2] << 16;
821 dst0[3] = src_r0[2] >> 16 | src_r0[3] << 16;
822 dst1[0] = src_r0[3] >> 16 | src_r1[0] << 16;
823 dst1[1] = src_r1[0] >> 16 | src_r1[1] << 16;
824 dst1[2] = src_r1[1] >> 16 | src_r1[2] << 16;
825 dst1[3] = src_r1[2] >> 16 | src_r1[3] << 16;
826 break;
827
828 case 3:
829 dst0[0] = src_l0[0] | src_r0[0] << 24;
830 dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24;
831 dst0[2] = src_r0[1] >> 8 | src_r0[2] << 24;
832 dst0[3] = src_r0[2] >> 8 | src_r0[3] << 24;
833 dst1[0] = src_r0[3] >> 8 | src_r1[0] << 24;
834 dst1[1] = src_r1[0] >> 8 | src_r1[1] << 24;
835 dst1[2] = src_r1[1] >> 8 | src_r1[2] << 24;
836 dst1[3] = src_r1[2] >> 8 | src_r1[3] << 24;
837 break;
838
839 case 4:
840 dst0[1] = src_r0[0];
841 dst0[2] = src_r0[1];
842 dst0[3] = src_r0[2];
843 dst1[0] = src_r0[3];
844 dst1[1] = src_r1[0];
845 dst1[2] = src_r1[1];
846 dst1[3] = src_r1[2];
847 break;
848
849 case 5:
850 dst0[1] = src_l0[1] | src_r0[0] << 8;
851 dst0[2] = src_r0[0] >> 24 | src_r0[1] << 8;
852 dst0[3] = src_r0[1] >> 24 | src_r0[2] << 8;
853 dst1[0] = src_r0[2] >> 24 | src_r0[3] << 8;
854 dst1[1] = src_r0[3] >> 24 | src_r1[0] << 8;
855 dst1[2] = src_r1[0] >> 24 | src_r1[1] << 8;
856 dst1[3] = src_r1[1] >> 24 | src_r1[2] << 8;
857 break;
858
859 case 6:
860 dst0[1] = src_l0[1] | src_r0[0] << 16;
861 dst0[2] = src_r0[0] >> 16 | src_r0[1] << 16;
862 dst0[3] = src_r0[1] >> 16 | src_r0[2] << 16;
863 dst1[0] = src_r0[2] >> 16 | src_r0[3] << 16;
864 dst1[1] = src_r0[3] >> 16 | src_r1[0] << 16;
865 dst1[2] = src_r1[0] >> 16 | src_r1[1] << 16;
866 dst1[3] = src_r1[1] >> 16 | src_r1[2] << 16;
867 break;
868
869 case 7:
870 dst0[1] = src_l0[1] | src_r0[0] << 24;
871 dst0[2] = src_r0[0] >> 8 | src_r0[1] << 24;
872 dst0[3] = src_r0[1] >> 8 | src_r0[2] << 24;
873 dst1[0] = src_r0[2] >> 8 | src_r0[3] << 24;
874 dst1[1] = src_r0[3] >> 8 | src_r1[0] << 24;
875 dst1[2] = src_r1[0] >> 8 | src_r1[1] << 24;
876 dst1[3] = src_r1[1] >> 8 | src_r1[2] << 24;
877 break;
878
879 case 8:
880 dst0[2] = src_r0[0];
881 dst0[3] = src_r0[1];
882 dst1[0] = src_r0[2];
883 dst1[1] = src_r0[3];
884 dst1[2] = src_r1[0];
885 dst1[3] = src_r1[1];
886 break;
887
888 case 9:
889 dst0[2] = src_l0[2] | src_r0[0] << 8;
890 dst0[3] = src_r0[0] >> 24 | src_r0[1] << 8;
891 dst1[0] = src_r0[1] >> 24 | src_r0[2] << 8;
892 dst1[1] = src_r0[2] >> 24 | src_r0[3] << 8;
893 dst1[2] = src_r0[3] >> 24 | src_r1[0] << 8;
894 dst1[3] = src_r1[0] >> 24 | src_r1[1] << 8;
895 break;
896
897 case 10:
898 dst0[2] = src_l0[2] | src_r0[0] << 16;
899 dst0[3] = src_r0[0] >> 16 | src_r0[1] << 16;
900 dst1[0] = src_r0[1] >> 16 | src_r0[2] << 16;
901 dst1[1] = src_r0[2] >> 16 | src_r0[3] << 16;
902 dst1[2] = src_r0[3] >> 16 | src_r1[0] << 16;
903 dst1[3] = src_r1[0] >> 16 | src_r1[1] << 16;
904 break;
905
906 case 11:
907 dst0[2] = src_l0[2] | src_r0[0] << 24;
908 dst0[3] = src_r0[0] >> 8 | src_r0[1] << 24;
909 dst1[0] = src_r0[1] >> 8 | src_r0[2] << 24;
910 dst1[1] = src_r0[2] >> 8 | src_r0[3] << 24;
911 dst1[2] = src_r0[3] >> 8 | src_r1[0] << 24;
912 dst1[3] = src_r1[0] >> 8 | src_r1[1] << 24;
913 break;
914
915 case 12:
916 dst0[3] = src_r0[0];
917 dst1[0] = src_r0[1];
918 dst1[1] = src_r0[2];
919 dst1[2] = src_r0[3];
920 dst1[3] = src_r1[0];
921 break;
922
923 case 13:
924 dst0[3] = src_l0[3] | src_r0[0] << 8;
925 dst1[0] = src_r0[0] >> 24 | src_r0[1] << 8;
926 dst1[1] = src_r0[1] >> 24 | src_r0[2] << 8;
927 dst1[2] = src_r0[2] >> 24 | src_r0[3] << 8;
928 dst1[3] = src_r0[3] >> 24 | src_r1[0] << 8;
929 break;
930
931 case 14:
932 dst0[3] = src_l0[3] | src_r0[0] << 16;
933 dst1[0] = src_r0[0] >> 16 | src_r0[1] << 16;
934 dst1[1] = src_r0[1] >> 16 | src_r0[2] << 16;
935 dst1[2] = src_r0[2] >> 16 | src_r0[3] << 16;
936 dst1[3] = src_r0[3] >> 16 | src_r1[0] << 16;
937 break;
938
939 case 15:
940 dst0[3] = src_l0[3] | src_r0[0] << 24;
941 dst1[0] = src_r0[0] >> 8 | src_r0[1] << 24;
942 dst1[1] = src_r0[1] >> 8 | src_r0[2] << 24;
943 dst1[2] = src_r0[2] >> 8 | src_r0[3] << 24;
944 dst1[3] = src_r0[3] >> 8 | src_r1[0] << 24;
945 break;
946
947 case 16:
948 dst1[0] = src_r0[0];
949 dst1[1] = src_r0[1];
950 dst1[2] = src_r0[2];
951 dst1[3] = src_r0[3];
952 break;
953
954 case 17:
955 dst1[0] = src_l1[0] | src_r0[0] << 8;
956 dst1[1] = src_r0[0] >> 24 | src_r0[1] << 8;
957 dst1[2] = src_r0[1] >> 24 | src_r0[2] << 8;
958 dst1[3] = src_r0[2] >> 24 | src_r0[3] << 8;
959 break;
960
961 case 18:
962 dst1[0] = src_l1[0] | src_r0[0] << 16;
963 dst1[1] = src_r0[0] >> 16 | src_r0[1] << 16;
964 dst1[2] = src_r0[1] >> 16 | src_r0[2] << 16;
965 dst1[3] = src_r0[2] >> 16 | src_r0[3] << 16;
966 break;
967
968 case 19:
969 dst1[0] = src_l1[0] | src_r0[0] << 24;
970 dst1[1] = src_r0[0] >> 8 | src_r0[1] << 24;
971 dst1[2] = src_r0[1] >> 8 | src_r0[2] << 24;
972 dst1[3] = src_r0[2] >> 8 | src_r0[3] << 24;
973 break;
974
975 case 20:
976 dst1[1] = src_r0[0];
977 dst1[2] = src_r0[1];
978 dst1[3] = src_r0[2];
979 break;
980
981 case 21:
982 dst1[1] = src_l1[1] | src_r0[0] << 8;
983 dst1[2] = src_r0[0] >> 24 | src_r0[1] << 8;
984 dst1[3] = src_r0[1] >> 24 | src_r0[2] << 8;
985 break;
986
987 case 22:
988 dst1[1] = src_l1[1] | src_r0[0] << 16;
989 dst1[2] = src_r0[0] >> 16 | src_r0[1] << 16;
990 dst1[3] = src_r0[1] >> 16 | src_r0[2] << 16;
991 break;
992
993 case 23:
994 dst1[1] = src_l1[1] | src_r0[0] << 24;
995 dst1[2] = src_r0[0] >> 8 | src_r0[1] << 24;
996 dst1[3] = src_r0[1] >> 8 | src_r0[2] << 24;
997 break;
998
999 case 24:
1000 dst1[2] = src_r0[0];
1001 dst1[3] = src_r0[1];
1002 break;
1003
1004 case 25:
1005 dst1[2] = src_l1[2] | src_r0[0] << 8;
1006 dst1[3] = src_r0[0] >> 24 | src_r0[1] << 8;
1007 break;
1008
1009 case 26:
1010 dst1[2] = src_l1[2] | src_r0[0] << 16;
1011 dst1[3] = src_r0[0] >> 16 | src_r0[1] << 16;
1012 break;
1013
1014 case 27:
1015 dst1[2] = src_l1[2] | src_r0[0] << 24;
1016 dst1[3] = src_r0[0] >> 8 | src_r0[1] << 24;
1017 break;
1018
1019 case 28:
1020 dst1[3] = src_r0[0];
1021 break;
1022
1023 case 29:
1024 dst1[3] = src_l1[3] | src_r0[0] << 8;
1025 break;
1026
1027 case 30:
1028 dst1[3] = src_l1[3] | src_r0[0] << 16;
1029 break;
1030
1031 case 31:
1032 dst1[3] = src_l1[3] | src_r0[0] << 24;
1033 break;
1034 }
1035 }
1036
1037 static void reverse_block (u32 in0[4], u32 in1[4], u32 out0[4], u32 out1[4], const u32 len)
1038 {
1039 rshift_block_N (in0, in1, out0, out1, 32 - len);
1040
1041 u32 tib40[4];
1042 u32 tib41[4];
1043
1044 tib40[0] = out1[3];
1045 tib40[1] = out1[2];
1046 tib40[2] = out1[1];
1047 tib40[3] = out1[0];
1048 tib41[0] = out0[3];
1049 tib41[1] = out0[2];
1050 tib41[2] = out0[1];
1051 tib41[3] = out0[0];
1052
1053 out0[0] = swap_workaround (tib40[0]);
1054 out0[1] = swap_workaround (tib40[1]);
1055 out0[2] = swap_workaround (tib40[2]);
1056 out0[3] = swap_workaround (tib40[3]);
1057 out1[0] = swap_workaround (tib41[0]);
1058 out1[1] = swap_workaround (tib41[1]);
1059 out1[2] = swap_workaround (tib41[2]);
1060 out1[3] = swap_workaround (tib41[3]);
1061 }
1062
1063 static u32 rule_op_mangle_lrest (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1064 {
1065 buf0[0] |= (generate_cmask (buf0[0]));
1066 buf0[1] |= (generate_cmask (buf0[1]));
1067 buf0[2] |= (generate_cmask (buf0[2]));
1068 buf0[3] |= (generate_cmask (buf0[3]));
1069 buf1[0] |= (generate_cmask (buf1[0]));
1070 buf1[1] |= (generate_cmask (buf1[1]));
1071 buf1[2] |= (generate_cmask (buf1[2]));
1072 buf1[3] |= (generate_cmask (buf1[3]));
1073
1074 return in_len;
1075 }
1076
1077 static u32 rule_op_mangle_urest (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1078 {
1079 buf0[0] &= ~(generate_cmask (buf0[0]));
1080 buf0[1] &= ~(generate_cmask (buf0[1]));
1081 buf0[2] &= ~(generate_cmask (buf0[2]));
1082 buf0[3] &= ~(generate_cmask (buf0[3]));
1083 buf1[0] &= ~(generate_cmask (buf1[0]));
1084 buf1[1] &= ~(generate_cmask (buf1[1]));
1085 buf1[2] &= ~(generate_cmask (buf1[2]));
1086 buf1[3] &= ~(generate_cmask (buf1[3]));
1087
1088 return in_len;
1089 }
1090
1091 static u32 rule_op_mangle_lrest_ufirst (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1092 {
1093 rule_op_mangle_lrest (p0, p1, buf0, buf1, in_len);
1094
1095 buf0[0] &= ~(0x00000020 & generate_cmask (buf0[0]));
1096
1097 return in_len;
1098 }
1099
1100 static u32 rule_op_mangle_urest_lfirst (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1101 {
1102 rule_op_mangle_urest (p0, p1, buf0, buf1, in_len);
1103
1104 buf0[0] |= (0x00000020 & generate_cmask (buf0[0]));
1105
1106 return in_len;
1107 }
1108
1109 static u32 rule_op_mangle_trest (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1110 {
1111 buf0[0] ^= (generate_cmask (buf0[0]));
1112 buf0[1] ^= (generate_cmask (buf0[1]));
1113 buf0[2] ^= (generate_cmask (buf0[2]));
1114 buf0[3] ^= (generate_cmask (buf0[3]));
1115 buf1[0] ^= (generate_cmask (buf1[0]));
1116 buf1[1] ^= (generate_cmask (buf1[1]));
1117 buf1[2] ^= (generate_cmask (buf1[2]));
1118 buf1[3] ^= (generate_cmask (buf1[3]));
1119
1120 return in_len;
1121 }
1122
1123 static u32 rule_op_mangle_toggle_at (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1124 {
1125 if (p0 >= in_len) return (in_len);
1126
1127 const u32 tmp = 0x20u << ((p0 & 3) * 8);
1128
1129 switch (p0 / 4)
1130 {
1131 case 0: buf0[0] ^= (tmp & generate_cmask (buf0[0])); break;
1132 case 1: buf0[1] ^= (tmp & generate_cmask (buf0[1])); break;
1133 case 2: buf0[2] ^= (tmp & generate_cmask (buf0[2])); break;
1134 case 3: buf0[3] ^= (tmp & generate_cmask (buf0[3])); break;
1135 case 4: buf1[0] ^= (tmp & generate_cmask (buf1[0])); break;
1136 case 5: buf1[1] ^= (tmp & generate_cmask (buf1[1])); break;
1137 case 6: buf1[2] ^= (tmp & generate_cmask (buf1[2])); break;
1138 case 7: buf1[3] ^= (tmp & generate_cmask (buf1[3])); break;
1139 }
1140
1141 return in_len;
1142 }
1143
1144 static u32 rule_op_mangle_reverse (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1145 {
1146 reverse_block (buf0, buf1, buf0, buf1, in_len);
1147
1148 return in_len;
1149 }
1150
1151 static u32 rule_op_mangle_dupeword (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1152 {
1153 if ((in_len + in_len) >= 32) return (in_len);
1154
1155 u32 out_len = in_len;
1156
1157 u32 tib40[4];
1158 u32 tib41[4];
1159
1160 tib40[0] = buf0[0];
1161 tib40[1] = buf0[1];
1162 tib40[2] = buf0[2];
1163 tib40[3] = buf0[3];
1164 tib41[0] = buf1[0];
1165 tib41[1] = buf1[1];
1166 tib41[2] = buf1[2];
1167 tib41[3] = buf1[3];
1168
1169 append_block8 (out_len, buf0, buf1, buf0, buf1, tib40, tib41);
1170
1171 out_len += in_len;
1172
1173 return out_len;
1174 }
1175
1176 static u32 rule_op_mangle_dupeword_times (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1177 {
1178 if (((in_len * p0) + in_len) >= 32) return (in_len);
1179
1180 u32 out_len = in_len;
1181
1182 u32 tib40[4];
1183 u32 tib41[4];
1184
1185 tib40[0] = buf0[0];
1186 tib40[1] = buf0[1];
1187 tib40[2] = buf0[2];
1188 tib40[3] = buf0[3];
1189 tib41[0] = buf1[0];
1190 tib41[1] = buf1[1];
1191 tib41[2] = buf1[2];
1192 tib41[3] = buf1[3];
1193
1194 for (u32 i = 0; i < p0; i++)
1195 {
1196 append_block8 (out_len, buf0, buf1, buf0, buf1, tib40, tib41);
1197
1198 out_len += in_len;
1199 }
1200
1201 return out_len;
1202 }
1203
1204 static u32 rule_op_mangle_reflect (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1205 {
1206 if ((in_len + in_len) >= 32) return (in_len);
1207
1208 u32 out_len = in_len;
1209
1210 u32 tib40[4];
1211 u32 tib41[4];
1212
1213 reverse_block (buf0, buf1, tib40, tib41, out_len);
1214
1215 append_block8 (out_len, buf0, buf1, buf0, buf1, tib40, tib41);
1216
1217 out_len += in_len;
1218
1219 return out_len;
1220 }
1221
1222 static u32 rule_op_mangle_append (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1223 {
1224 if ((in_len + 1) >= 32) return (in_len);
1225
1226 u32 out_len = in_len;
1227
1228 append_block1 (out_len, buf0, buf1, p0);
1229
1230 out_len++;
1231
1232 return out_len;
1233 }
1234
1235 static u32 rule_op_mangle_prepend (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1236 {
1237 if ((in_len + 1) >= 32) return (in_len);
1238
1239 u32 out_len = in_len;
1240
1241 rshift_block (buf0, buf1, buf0, buf1);
1242
1243 buf0[0] = buf0[0] | p0;
1244
1245 out_len++;
1246
1247 return out_len;
1248 }
1249
1250 static u32 rule_op_mangle_rotate_left (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1251 {
1252 if (in_len == 0) return (in_len);
1253
1254 const u32 in_len1 = in_len - 1;
1255
1256 const u32 sh = (in_len1 & 3) * 8;
1257
1258 const u32 tmp = (buf0[0] & 0xff) << sh;
1259
1260 lshift_block (buf0, buf1, buf0, buf1);
1261
1262 switch (in_len1 / 4)
1263 {
1264 case 0: buf0[0] |= tmp; break;
1265 case 1: buf0[1] |= tmp; break;
1266 case 2: buf0[2] |= tmp; break;
1267 case 3: buf0[3] |= tmp; break;
1268 case 4: buf1[0] |= tmp; break;
1269 case 5: buf1[1] |= tmp; break;
1270 case 6: buf1[2] |= tmp; break;
1271 case 7: buf1[3] |= tmp; break;
1272 }
1273
1274 return in_len;
1275 }
1276
1277 static u32 rule_op_mangle_rotate_right (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1278 {
1279 if (in_len == 0) return (in_len);
1280
1281 const u32 in_len1 = in_len - 1;
1282
1283 const u32 sh = (in_len1 & 3) * 8;
1284
1285 u32 tmp = 0;
1286
1287 switch (in_len1 / 4)
1288 {
1289 case 0: tmp = (buf0[0] >> sh) & 0xff; break;
1290 case 1: tmp = (buf0[1] >> sh) & 0xff; break;
1291 case 2: tmp = (buf0[2] >> sh) & 0xff; break;
1292 case 3: tmp = (buf0[3] >> sh) & 0xff; break;
1293 case 4: tmp = (buf1[0] >> sh) & 0xff; break;
1294 case 5: tmp = (buf1[1] >> sh) & 0xff; break;
1295 case 6: tmp = (buf1[2] >> sh) & 0xff; break;
1296 case 7: tmp = (buf1[3] >> sh) & 0xff; break;
1297 }
1298
1299 rshift_block (buf0, buf1, buf0, buf1);
1300
1301 buf0[0] |= tmp;
1302
1303 truncate_right (buf0, buf1, in_len);
1304
1305 return in_len;
1306 }
1307
1308 static u32 rule_op_mangle_delete_first (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1309 {
1310 if (in_len == 0) return (in_len);
1311
1312 const u32 in_len1 = in_len - 1;
1313
1314 lshift_block (buf0, buf1, buf0, buf1);
1315
1316 return in_len1;
1317 }
1318
1319 static u32 rule_op_mangle_delete_last (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1320 {
1321 if (in_len == 0) return (in_len);
1322
1323 const u32 in_len1 = in_len - 1;
1324
1325 const u32 tmp = (1 << ((in_len1 & 3) * 8)) - 1;
1326
1327 switch (in_len1 / 4)
1328 {
1329 case 0: buf0[0] &= tmp; break;
1330 case 1: buf0[1] &= tmp; break;
1331 case 2: buf0[2] &= tmp; break;
1332 case 3: buf0[3] &= tmp; break;
1333 case 4: buf1[0] &= tmp; break;
1334 case 5: buf1[1] &= tmp; break;
1335 case 6: buf1[2] &= tmp; break;
1336 case 7: buf1[3] &= tmp; break;
1337 }
1338
1339 return in_len1;
1340 }
1341
1342 static u32 rule_op_mangle_delete_at (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1343 {
1344 if (p0 >= in_len) return (in_len);
1345
1346 u32 out_len = in_len;
1347
1348 u32 tib40[4];
1349 u32 tib41[4];
1350
1351 lshift_block (buf0, buf1, tib40, tib41);
1352
1353 const u32 ml = (1 << ((p0 & 3) * 8)) - 1;
1354 const u32 mr = ~ml;
1355
1356 switch (p0 / 4)
1357 {
1358 case 0: buf0[0] = (buf0[0] & ml)
1359 | (tib40[0] & mr);
1360 buf0[1] = tib40[1];
1361 buf0[2] = tib40[2];
1362 buf0[3] = tib40[3];
1363 buf1[0] = tib41[0];
1364 buf1[1] = tib41[1];
1365 buf1[2] = tib41[2];
1366 buf1[3] = tib41[3];
1367 break;
1368 case 1: buf0[1] = (buf0[1] & ml)
1369 | (tib40[1] & mr);
1370 buf0[2] = tib40[2];
1371 buf0[3] = tib40[3];
1372 buf1[0] = tib41[0];
1373 buf1[1] = tib41[1];
1374 buf1[2] = tib41[2];
1375 buf1[3] = tib41[3];
1376 break;
1377 case 2: buf0[2] = (buf0[2] & ml)
1378 | (tib40[2] & mr);
1379 buf0[3] = tib40[3];
1380 buf1[0] = tib41[0];
1381 buf1[1] = tib41[1];
1382 buf1[2] = tib41[2];
1383 buf1[3] = tib41[3];
1384 break;
1385 case 3: buf0[3] = (buf0[3] & ml)
1386 | (tib40[3] & mr);
1387 buf1[0] = tib41[0];
1388 buf1[1] = tib41[1];
1389 buf1[2] = tib41[2];
1390 buf1[3] = tib41[3];
1391 break;
1392 case 4: buf1[0] = (buf1[0] & ml)
1393 | (tib41[0] & mr);
1394 buf1[1] = tib41[1];
1395 buf1[2] = tib41[2];
1396 buf1[3] = tib41[3];
1397 break;
1398 case 5: buf1[1] = (buf1[1] & ml)
1399 | (tib41[1] & mr);
1400 buf1[2] = tib41[2];
1401 buf1[3] = tib41[3];
1402 break;
1403 case 6: buf1[2] = (buf1[2] & ml)
1404 | (tib41[2] & mr);
1405 buf1[3] = tib41[3];
1406 break;
1407 case 7: buf1[3] = (buf1[3] & ml)
1408 | (tib41[3] & mr);
1409 break;
1410 }
1411
1412 out_len--;
1413
1414 return out_len;
1415 }
1416
1417 static u32 rule_op_mangle_extract (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1418 {
1419 if (p0 >= in_len) return (in_len);
1420
1421 if ((p0 + p1) > in_len) return (in_len);
1422
1423 u32 out_len = p1;
1424
1425 lshift_block_N (buf0, buf1, buf0, buf1, p0);
1426
1427 truncate_right (buf0, buf1, out_len);
1428
1429 return out_len;
1430 }
1431
1432 static u32 rule_op_mangle_omit (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1433 {
1434 if (p0 >= in_len) return (in_len);
1435
1436 if ((p0 + p1) > in_len) return (in_len);
1437
1438 u32 out_len = in_len;
1439
1440 u32 tib40[4];
1441 u32 tib41[4];
1442
1443 tib40[0] = 0;
1444 tib40[1] = 0;
1445 tib40[2] = 0;
1446 tib40[3] = 0;
1447 tib41[0] = 0;
1448 tib41[1] = 0;
1449 tib41[2] = 0;
1450 tib41[3] = 0;
1451
1452 lshift_block_N (buf0, buf1, tib40, tib41, p1);
1453
1454 const u32 ml = (1 << ((p0 & 3) * 8)) - 1;
1455 const u32 mr = ~ml;
1456
1457 switch (p0 / 4)
1458 {
1459 case 0: buf0[0] = (buf0[0] & ml)
1460 | (tib40[0] & mr);
1461 buf0[1] = tib40[1];
1462 buf0[2] = tib40[2];
1463 buf0[3] = tib40[3];
1464 buf1[0] = tib41[0];
1465 buf1[1] = tib41[1];
1466 buf1[2] = tib41[2];
1467 buf1[3] = tib41[3];
1468 break;
1469 case 1: buf0[1] = (buf0[1] & ml)
1470 | (tib40[1] & mr);
1471 buf0[2] = tib40[2];
1472 buf0[3] = tib40[3];
1473 buf1[0] = tib41[0];
1474 buf1[1] = tib41[1];
1475 buf1[2] = tib41[2];
1476 buf1[3] = tib41[3];
1477 break;
1478 case 2: buf0[2] = (buf0[2] & ml)
1479 | (tib40[2] & mr);
1480 buf0[3] = tib40[3];
1481 buf1[0] = tib41[0];
1482 buf1[1] = tib41[1];
1483 buf1[2] = tib41[2];
1484 buf1[3] = tib41[3];
1485 break;
1486 case 3: buf0[3] = (buf0[3] & ml)
1487 | (tib40[3] & mr);
1488 buf1[0] = tib41[0];
1489 buf1[1] = tib41[1];
1490 buf1[2] = tib41[2];
1491 buf1[3] = tib41[3];
1492 break;
1493 case 4: buf1[0] = (buf1[0] & ml)
1494 | (tib41[0] & mr);
1495 buf1[1] = tib41[1];
1496 buf1[2] = tib41[2];
1497 buf1[3] = tib41[3];
1498 break;
1499 case 5: buf1[1] = (buf1[1] & ml)
1500 | (tib41[1] & mr);
1501 buf1[2] = tib41[2];
1502 buf1[3] = tib41[3];
1503 break;
1504 case 6: buf1[2] = (buf1[2] & ml)
1505 | (tib41[2] & mr);
1506 buf1[3] = tib41[3];
1507 break;
1508 case 7: buf1[3] = (buf1[3] & ml)
1509 | (tib41[3] & mr);
1510 break;
1511 }
1512
1513 out_len -= p1;
1514
1515 return out_len;
1516 }
1517
1518 static u32 rule_op_mangle_insert (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1519 {
1520 if (p0 > in_len) return (in_len);
1521
1522 if ((in_len + 1) >= 32) return (in_len);
1523
1524 u32 out_len = in_len;
1525
1526 u32 tib40[4];
1527 u32 tib41[4];
1528
1529 rshift_block (buf0, buf1, tib40, tib41);
1530
1531 const u32 p1n = p1 << ((p0 & 3) * 8);
1532
1533 const u32 ml = (1 << ((p0 & 3) * 8)) - 1;
1534
1535 const u32 mr = 0xffffff00 << ((p0 & 3) * 8);
1536
1537 switch (p0 / 4)
1538 {
1539 case 0: buf0[0] = (buf0[0] & ml) | p1n | (tib40[0] & mr);
1540 buf0[1] = tib40[1];
1541 buf0[2] = tib40[2];
1542 buf0[3] = tib40[3];
1543 buf1[0] = tib41[0];
1544 buf1[1] = tib41[1];
1545 buf1[2] = tib41[2];
1546 buf1[3] = tib41[3];
1547 break;
1548 case 1: buf0[1] = (buf0[1] & ml) | p1n | (tib40[1] & mr);
1549 buf0[2] = tib40[2];
1550 buf0[3] = tib40[3];
1551 buf1[0] = tib41[0];
1552 buf1[1] = tib41[1];
1553 buf1[2] = tib41[2];
1554 buf1[3] = tib41[3];
1555 break;
1556 case 2: buf0[2] = (buf0[2] & ml) | p1n | (tib40[2] & mr);
1557 buf0[3] = tib40[3];
1558 buf1[0] = tib41[0];
1559 buf1[1] = tib41[1];
1560 buf1[2] = tib41[2];
1561 buf1[3] = tib41[3];
1562 break;
1563 case 3: buf0[3] = (buf0[3] & ml) | p1n | (tib40[3] & mr);
1564 buf1[0] = tib41[0];
1565 buf1[1] = tib41[1];
1566 buf1[2] = tib41[2];
1567 buf1[3] = tib41[3];
1568 break;
1569 case 4: buf1[0] = (buf1[0] & ml) | p1n | (tib41[0] & mr);
1570 buf1[1] = tib41[1];
1571 buf1[2] = tib41[2];
1572 buf1[3] = tib41[3];
1573 break;
1574 case 5: buf1[1] = (buf1[1] & ml) | p1n | (tib41[1] & mr);
1575 buf1[2] = tib41[2];
1576 buf1[3] = tib41[3];
1577 break;
1578 case 6: buf1[2] = (buf1[2] & ml) | p1n | (tib41[2] & mr);
1579 buf1[3] = tib41[3];
1580 break;
1581 case 7: buf1[3] = (buf1[3] & ml) | p1n | (tib41[3] & mr);
1582 break;
1583 }
1584
1585 out_len++;
1586
1587 return out_len;
1588 }
1589
1590 static u32 rule_op_mangle_overstrike (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1591 {
1592 if (p0 >= in_len) return (in_len);
1593
1594 const u32 p1n = p1 << ((p0 & 3) * 8);
1595
1596 const u32 m = ~(0xffu << ((p0 & 3) * 8));
1597
1598 switch (p0 / 4)
1599 {
1600 case 0: buf0[0] = (buf0[0] & m) | p1n; break;
1601 case 1: buf0[1] = (buf0[1] & m) | p1n; break;
1602 case 2: buf0[2] = (buf0[2] & m) | p1n; break;
1603 case 3: buf0[3] = (buf0[3] & m) | p1n; break;
1604 case 4: buf1[0] = (buf1[0] & m) | p1n; break;
1605 case 5: buf1[1] = (buf1[1] & m) | p1n; break;
1606 case 6: buf1[2] = (buf1[2] & m) | p1n; break;
1607 case 7: buf1[3] = (buf1[3] & m) | p1n; break;
1608 }
1609
1610 return in_len;
1611 }
1612
1613 static u32 rule_op_mangle_truncate_at (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1614 {
1615 if (p0 >= in_len) return (in_len);
1616
1617 truncate_right (buf0, buf1, p0);
1618
1619 return p0;
1620 }
1621
1622 static u32 rule_op_mangle_replace (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1623 {
1624 for (u32 i = 0; i < in_len; i++)
1625 {
1626 switch (i)
1627 {
1628 case 0: if (((buf0[0] >> 0) & 0xFF) == p0) buf0[0] = (buf0[0] & 0xFFFFFF00) | p1 << 0; break;
1629 case 1: if (((buf0[0] >> 8) & 0xFF) == p0) buf0[0] = (buf0[0] & 0xFFFF00FF) | p1 << 8; break;
1630 case 2: if (((buf0[0] >> 16) & 0xFF) == p0) buf0[0] = (buf0[0] & 0xFF00FFFF) | p1 << 16; break;
1631 case 3: if (((buf0[0] >> 24) & 0xFF) == p0) buf0[0] = (buf0[0] & 0x00FFFFFF) | p1 << 24; break;
1632 case 4: if (((buf0[1] >> 0) & 0xFF) == p0) buf0[1] = (buf0[1] & 0xFFFFFF00) | p1 << 0; break;
1633 case 5: if (((buf0[1] >> 8) & 0xFF) == p0) buf0[1] = (buf0[1] & 0xFFFF00FF) | p1 << 8; break;
1634 case 6: if (((buf0[1] >> 16) & 0xFF) == p0) buf0[1] = (buf0[1] & 0xFF00FFFF) | p1 << 16; break;
1635 case 7: if (((buf0[1] >> 24) & 0xFF) == p0) buf0[1] = (buf0[1] & 0x00FFFFFF) | p1 << 24; break;
1636 case 8: if (((buf0[2] >> 0) & 0xFF) == p0) buf0[2] = (buf0[2] & 0xFFFFFF00) | p1 << 0; break;
1637 case 9: if (((buf0[2] >> 8) & 0xFF) == p0) buf0[2] = (buf0[2] & 0xFFFF00FF) | p1 << 8; break;
1638 case 10: if (((buf0[2] >> 16) & 0xFF) == p0) buf0[2] = (buf0[2] & 0xFF00FFFF) | p1 << 16; break;
1639 case 11: if (((buf0[2] >> 24) & 0xFF) == p0) buf0[2] = (buf0[2] & 0x00FFFFFF) | p1 << 24; break;
1640 case 12: if (((buf0[3] >> 0) & 0xFF) == p0) buf0[3] = (buf0[3] & 0xFFFFFF00) | p1 << 0; break;
1641 case 13: if (((buf0[3] >> 8) & 0xFF) == p0) buf0[3] = (buf0[3] & 0xFFFF00FF) | p1 << 8; break;
1642 case 14: if (((buf0[3] >> 16) & 0xFF) == p0) buf0[3] = (buf0[3] & 0xFF00FFFF) | p1 << 16; break;
1643 case 15: if (((buf0[3] >> 24) & 0xFF) == p0) buf0[3] = (buf0[3] & 0x00FFFFFF) | p1 << 24; break;
1644 case 16: if (((buf1[0] >> 0) & 0xFF) == p0) buf1[0] = (buf1[0] & 0xFFFFFF00) | p1 << 0; break;
1645 case 17: if (((buf1[0] >> 8) & 0xFF) == p0) buf1[0] = (buf1[0] & 0xFFFF00FF) | p1 << 8; break;
1646 case 18: if (((buf1[0] >> 16) & 0xFF) == p0) buf1[0] = (buf1[0] & 0xFF00FFFF) | p1 << 16; break;
1647 case 19: if (((buf1[0] >> 24) & 0xFF) == p0) buf1[0] = (buf1[0] & 0x00FFFFFF) | p1 << 24; break;
1648 case 20: if (((buf1[1] >> 0) & 0xFF) == p0) buf1[1] = (buf1[1] & 0xFFFFFF00) | p1 << 0; break;
1649 case 21: if (((buf1[1] >> 8) & 0xFF) == p0) buf1[1] = (buf1[1] & 0xFFFF00FF) | p1 << 8; break;
1650 case 22: if (((buf1[1] >> 16) & 0xFF) == p0) buf1[1] = (buf1[1] & 0xFF00FFFF) | p1 << 16; break;
1651 case 23: if (((buf1[1] >> 24) & 0xFF) == p0) buf1[1] = (buf1[1] & 0x00FFFFFF) | p1 << 24; break;
1652 case 24: if (((buf1[2] >> 0) & 0xFF) == p0) buf1[2] = (buf1[2] & 0xFFFFFF00) | p1 << 0; break;
1653 case 25: if (((buf1[2] >> 8) & 0xFF) == p0) buf1[2] = (buf1[2] & 0xFFFF00FF) | p1 << 8; break;
1654 case 26: if (((buf1[2] >> 16) & 0xFF) == p0) buf1[2] = (buf1[2] & 0xFF00FFFF) | p1 << 16; break;
1655 case 27: if (((buf1[2] >> 24) & 0xFF) == p0) buf1[2] = (buf1[2] & 0x00FFFFFF) | p1 << 24; break;
1656 case 28: if (((buf1[3] >> 0) & 0xFF) == p0) buf1[3] = (buf1[3] & 0xFFFFFF00) | p1 << 0; break;
1657 case 29: if (((buf1[3] >> 8) & 0xFF) == p0) buf1[3] = (buf1[3] & 0xFFFF00FF) | p1 << 8; break;
1658 case 30: if (((buf1[3] >> 16) & 0xFF) == p0) buf1[3] = (buf1[3] & 0xFF00FFFF) | p1 << 16; break;
1659 case 31: if (((buf1[3] >> 24) & 0xFF) == p0) buf1[3] = (buf1[3] & 0x00FFFFFF) | p1 << 24; break;
1660 }
1661 }
1662
1663 return in_len;
1664 }
1665
1666 /*
1667 static u32 rule_op_mangle_purgechar (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1668 {
1669 // TODO
1670 return in_len;
1671 }
1672
1673 static u32 rule_op_mangle_togglecase_rec (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1674 {
1675 // TODO
1676 return in_len;
1677 }
1678 */
1679
1680 static u32 rule_op_mangle_dupechar_first (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1681 {
1682 if ( in_len == 0) return (in_len);
1683 if ((in_len + p0) >= 32) return (in_len);
1684
1685 u32 out_len = in_len;
1686
1687 const u32 tmp = buf0[0] & 0xFF;
1688
1689 rshift_block_N (buf0, buf1, buf0, buf1, p0);
1690
1691 switch (p0)
1692 {
1693 case 1: buf0[0] |= tmp << 0;
1694 break;
1695 case 2: buf0[0] |= tmp << 0 | tmp << 8;
1696 break;
1697 case 3: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16;
1698 break;
1699 case 4: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1700 break;
1701 case 5: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1702 buf0[1] |= tmp << 0;
1703 break;
1704 case 6: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1705 buf0[1] |= tmp << 0 | tmp << 8;
1706 break;
1707 case 7: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1708 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16;
1709 break;
1710 case 8: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1711 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1712 break;
1713 case 9: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1714 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1715 buf0[2] |= tmp << 0;
1716 break;
1717 case 10: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1718 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1719 buf0[2] |= tmp << 0 | tmp << 8;
1720 break;
1721 case 11: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1722 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1723 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16;
1724 break;
1725 case 12: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1726 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1727 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1728 break;
1729 case 13: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1730 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1731 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1732 buf0[3] |= tmp << 0;
1733 break;
1734 case 14: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1735 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1736 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1737 buf0[3] |= tmp << 0 | tmp << 8;
1738 break;
1739 case 15: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1740 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1741 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1742 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16;
1743 break;
1744 case 16: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1745 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1746 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1747 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1748 break;
1749 case 17: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1750 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1751 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1752 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1753 buf1[0] |= tmp << 0;
1754 break;
1755 case 18: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1756 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1757 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1758 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1759 buf1[0] |= tmp << 0 | tmp << 8;
1760 break;
1761 case 19: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1762 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1763 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1764 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1765 buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16;
1766 break;
1767 case 20: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1768 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1769 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1770 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1771 buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1772 break;
1773 case 21: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1774 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1775 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1776 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1777 buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1778 buf1[1] |= tmp << 0;
1779 break;
1780 case 22: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1781 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1782 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1783 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1784 buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1785 buf1[1] |= tmp << 0 | tmp << 8;
1786 break;
1787 case 23: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1788 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1789 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1790 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1791 buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1792 buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16;
1793 break;
1794 case 24: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1795 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1796 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1797 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1798 buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1799 buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1800 break;
1801 case 25: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1802 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1803 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1804 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1805 buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1806 buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1807 buf1[2] |= tmp << 0;
1808 break;
1809 case 26: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1810 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1811 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1812 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1813 buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1814 buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1815 buf1[2] |= tmp << 0 | tmp << 8;
1816 break;
1817 case 27: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1818 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1819 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1820 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1821 buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1822 buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1823 buf1[2] |= tmp << 0 | tmp << 8 | tmp << 16;
1824 break;
1825 case 28: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1826 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1827 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1828 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1829 buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1830 buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1831 buf1[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1832 break;
1833 case 29: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1834 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1835 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1836 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1837 buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1838 buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1839 buf1[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1840 buf1[3] |= tmp << 0;
1841 break;
1842 case 30: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1843 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1844 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1845 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1846 buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1847 buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1848 buf1[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1849 buf1[3] |= tmp << 0 | tmp << 8;
1850 break;
1851 case 31: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1852 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1853 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1854 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1855 buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1856 buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1857 buf1[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1858 buf1[3] |= tmp << 0 | tmp << 8 | tmp << 16;
1859 break;
1860 }
1861
1862 out_len += p0;
1863
1864 return out_len;
1865 }
1866
1867 static u32 rule_op_mangle_dupechar_last (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1868 {
1869 if ( in_len == 0) return (in_len);
1870 if ((in_len + p0) >= 32) return (in_len);
1871
1872 const u32 in_len1 = in_len - 1;
1873
1874 const u32 sh = (in_len1 & 3) * 8;
1875
1876 u32 tmp = 0;
1877
1878 switch (in_len1 / 4)
1879 {
1880 case 0: tmp = (buf0[0] >> sh) & 0xff; break;
1881 case 1: tmp = (buf0[1] >> sh) & 0xff; break;
1882 case 2: tmp = (buf0[2] >> sh) & 0xff; break;
1883 case 3: tmp = (buf0[3] >> sh) & 0xff; break;
1884 case 4: tmp = (buf1[0] >> sh) & 0xff; break;
1885 case 5: tmp = (buf1[1] >> sh) & 0xff; break;
1886 case 6: tmp = (buf1[2] >> sh) & 0xff; break;
1887 case 7: tmp = (buf1[3] >> sh) & 0xff; break;
1888 }
1889
1890 u32 out_len = in_len;
1891
1892 for (u32 i = 0; i < p0; i++)
1893 {
1894 append_block1 (out_len, buf0, buf1, tmp);
1895
1896 out_len++;
1897 }
1898
1899 return out_len;
1900 }
1901
1902 static u32 rule_op_mangle_dupechar_all (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1903 {
1904 if ( in_len == 0) return (in_len);
1905 if ((in_len + in_len) >= 32) return (in_len);
1906
1907 u32 out_len = in_len;
1908
1909 u32 tib40[4];
1910 u32 tib41[4];
1911
1912 tib40[0] = ((buf0[0] & 0x000000FF) << 0) | ((buf0[0] & 0x0000FF00) << 8);
1913 tib40[1] = ((buf0[0] & 0x00FF0000) >> 16) | ((buf0[0] & 0xFF000000) >> 8);
1914 tib40[2] = ((buf0[1] & 0x000000FF) << 0) | ((buf0[1] & 0x0000FF00) << 8);
1915 tib40[3] = ((buf0[1] & 0x00FF0000) >> 16) | ((buf0[1] & 0xFF000000) >> 8);
1916 tib41[0] = ((buf0[2] & 0x000000FF) << 0) | ((buf0[2] & 0x0000FF00) << 8);
1917 tib41[1] = ((buf0[2] & 0x00FF0000) >> 16) | ((buf0[2] & 0xFF000000) >> 8);
1918 tib41[2] = ((buf0[3] & 0x000000FF) << 0) | ((buf0[3] & 0x0000FF00) << 8);
1919 tib41[3] = ((buf0[3] & 0x00FF0000) >> 16) | ((buf0[3] & 0xFF000000) >> 8);
1920
1921 buf0[0] = tib40[0] | (tib40[0] << 8);
1922 buf0[1] = tib40[1] | (tib40[1] << 8);
1923 buf0[2] = tib40[2] | (tib40[2] << 8);
1924 buf0[3] = tib40[3] | (tib40[3] << 8);
1925 buf1[0] = tib41[0] | (tib41[0] << 8);
1926 buf1[1] = tib41[1] | (tib41[1] << 8);
1927 buf1[2] = tib41[2] | (tib41[2] << 8);
1928 buf1[3] = tib41[3] | (tib41[3] << 8);
1929
1930 out_len = out_len + out_len;
1931
1932 return out_len;
1933 }
1934
1935 static u32 rule_op_mangle_switch_first (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1936 {
1937 if (in_len < 2) return (in_len);
1938
1939 buf0[0] = (buf0[0] & 0xFFFF0000) | ((buf0[0] << 8) & 0x0000FF00) | ((buf0[0] >> 8) & 0x000000FF);
1940
1941 return in_len;
1942 }
1943
1944 static u32 rule_op_mangle_switch_last (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1945 {
1946 if (in_len < 2) return (in_len);
1947
1948 switch (in_len)
1949 {
1950 case 2: buf0[0] = ((buf0[0] << 8) & 0x0000FF00) | ((buf0[0] >> 8) & 0x000000FF);
1951 break;
1952 case 3: buf0[0] = (buf0[0] & 0x000000FF) | ((buf0[0] << 8) & 0x00FF0000) | ((buf0[0] >> 8) & 0x0000FF00);
1953 break;
1954 case 4: buf0[0] = (buf0[0] & 0x0000FFFF) | ((buf0[0] << 8) & 0xFF000000) | ((buf0[0] >> 8) & 0x00FF0000);
1955 break;
1956 case 5: buf0[1] = (buf0[0] & 0xFF000000) | buf0[1];
1957 buf0[0] = (buf0[0] & 0x00FFFFFF) | (buf0[1] << 24);
1958 buf0[1] = (buf0[1] >> 24);
1959 break;
1960 case 6: buf0[1] = ((buf0[1] << 8) & 0x0000FF00) | ((buf0[1] >> 8) & 0x000000FF);
1961 break;
1962 case 7: buf0[1] = (buf0[1] & 0x000000FF) | ((buf0[1] << 8) & 0x00FF0000) | ((buf0[1] >> 8) & 0x0000FF00);
1963 break;
1964 case 8: buf0[1] = (buf0[1] & 0x0000FFFF) | ((buf0[1] << 8) & 0xFF000000) | ((buf0[1] >> 8) & 0x00FF0000);
1965 break;
1966 case 9: buf0[2] = (buf0[1] & 0xFF000000) | buf0[2];
1967 buf0[1] = (buf0[1] & 0x00FFFFFF) | (buf0[2] << 24);
1968 buf0[2] = (buf0[2] >> 24);
1969 break;
1970 case 10: buf0[2] = ((buf0[2] << 8) & 0x0000FF00) | ((buf0[2] >> 8) & 0x000000FF);
1971 break;
1972 case 11: buf0[2] = (buf0[2] & 0x000000FF) | ((buf0[2] << 8) & 0x00FF0000) | ((buf0[2] >> 8) & 0x0000FF00);
1973 break;
1974 case 12: buf0[2] = (buf0[2] & 0x0000FFFF) | ((buf0[2] << 8) & 0xFF000000) | ((buf0[2] >> 8) & 0x00FF0000);
1975 break;
1976 case 13: buf0[3] = (buf0[2] & 0xFF000000) | buf0[3];
1977 buf0[2] = (buf0[2] & 0x00FFFFFF) | (buf0[3] << 24);
1978 buf0[3] = (buf0[3] >> 24);
1979 break;
1980 case 14: buf0[3] = ((buf0[3] << 8) & 0x0000FF00) | ((buf0[3] >> 8) & 0x000000FF);
1981 break;
1982 case 15: buf0[3] = (buf0[3] & 0x000000FF) | ((buf0[3] << 8) & 0x00FF0000) | ((buf0[3] >> 8) & 0x0000FF00);
1983 break;
1984 case 16: buf0[3] = (buf0[3] & 0x0000FFFF) | ((buf0[3] << 8) & 0xFF000000) | ((buf0[3] >> 8) & 0x00FF0000);
1985 break;
1986 case 17: buf1[0] = (buf0[3] & 0xFF000000) | buf1[0];
1987 buf0[3] = (buf0[3] & 0x00FFFFFF) | (buf1[0] << 24);
1988 buf1[0] = (buf1[0] >> 24);
1989 break;
1990 case 18: buf1[0] = ((buf1[0] << 8) & 0x0000FF00) | ((buf1[0] >> 8) & 0x000000FF);
1991 break;
1992 case 19: buf1[0] = (buf1[0] & 0x000000FF) | ((buf1[0] << 8) & 0x00FF0000) | ((buf1[0] >> 8) & 0x0000FF00);
1993 break;
1994 case 20: buf1[0] = (buf1[0] & 0x0000FFFF) | ((buf1[0] << 8) & 0xFF000000) | ((buf1[0] >> 8) & 0x00FF0000);
1995 break;
1996 case 21: buf1[1] = (buf1[0] & 0xFF000000) | buf1[1];
1997 buf1[0] = (buf1[0] & 0x00FFFFFF) | (buf1[1] << 24);
1998 buf1[1] = (buf1[1] >> 24);
1999 break;
2000 case 22: buf1[1] = ((buf1[1] << 8) & 0x0000FF00) | ((buf1[1] >> 8) & 0x000000FF);
2001 break;
2002 case 23: buf1[1] = (buf1[1] & 0x000000FF) | ((buf1[1] << 8) & 0x00FF0000) | ((buf1[1] >> 8) & 0x0000FF00);
2003 break;
2004 case 24: buf1[1] = (buf1[1] & 0x0000FFFF) | ((buf1[1] << 8) & 0xFF000000) | ((buf1[1] >> 8) & 0x00FF0000);
2005 break;
2006 case 25: buf1[2] = (buf1[1] & 0xFF000000) | buf1[2];
2007 buf1[1] = (buf1[1] & 0x00FFFFFF) | (buf1[2] << 24);
2008 buf1[2] = (buf1[2] >> 24);
2009 break;
2010 case 26: buf1[2] = ((buf1[2] << 8) & 0x0000FF00) | ((buf1[2] >> 8) & 0x000000FF);
2011 break;
2012 case 27: buf1[2] = (buf1[2] & 0x000000FF) | ((buf1[2] << 8) & 0x00FF0000) | ((buf1[2] >> 8) & 0x0000FF00);
2013 break;
2014 case 28: buf1[2] = (buf1[2] & 0x0000FFFF) | ((buf1[2] << 8) & 0xFF000000) | ((buf1[2] >> 8) & 0x00FF0000);
2015 break;
2016 case 29: buf1[3] = (buf1[2] & 0xFF000000) | buf1[3];
2017 buf1[2] = (buf1[2] & 0x00FFFFFF) | (buf1[3] << 24);
2018 buf1[3] = (buf1[3] >> 24);
2019 break;
2020 case 30: buf1[3] = ((buf1[3] << 8) & 0x0000FF00) | ((buf1[3] >> 8) & 0x000000FF);
2021 break;
2022 case 31: buf1[3] = (buf1[3] & 0x000000FF) | ((buf1[3] << 8) & 0x00FF0000) | ((buf1[3] >> 8) & 0x0000FF00);
2023 break;
2024 }
2025
2026 return in_len;
2027 }
2028
2029 static u32 rule_op_mangle_switch_at (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2030 {
2031 if (p0 >= in_len) return (in_len);
2032 if (p1 >= in_len) return (in_len);
2033
2034 u32 tmp0 = 0;
2035 u32 tmp1 = 0;
2036
2037 switch (p0)
2038 {
2039 case 0: tmp0 = (buf0[0] >> 0) & 0xFF;
2040 break;
2041 case 1: tmp0 = (buf0[0] >> 8) & 0xFF;
2042 break;
2043 case 2: tmp0 = (buf0[0] >> 16) & 0xFF;
2044 break;
2045 case 3: tmp0 = (buf0[0] >> 24) & 0xFF;
2046 break;
2047 case 4: tmp0 = (buf0[1] >> 0) & 0xFF;
2048 break;
2049 case 5: tmp0 = (buf0[1] >> 8) & 0xFF;
2050 break;
2051 case 6: tmp0 = (buf0[1] >> 16) & 0xFF;
2052 break;
2053 case 7: tmp0 = (buf0[1] >> 24) & 0xFF;
2054 break;
2055 case 8: tmp0 = (buf0[2] >> 0) & 0xFF;
2056 break;
2057 case 9: tmp0 = (buf0[2] >> 8) & 0xFF;
2058 break;
2059 case 10: tmp0 = (buf0[2] >> 16) & 0xFF;
2060 break;
2061 case 11: tmp0 = (buf0[2] >> 24) & 0xFF;
2062 break;
2063 case 12: tmp0 = (buf0[3] >> 0) & 0xFF;
2064 break;
2065 case 13: tmp0 = (buf0[3] >> 8) & 0xFF;
2066 break;
2067 case 14: tmp0 = (buf0[3] >> 16) & 0xFF;
2068 break;
2069 case 15: tmp0 = (buf0[3] >> 24) & 0xFF;
2070 break;
2071 case 16: tmp0 = (buf1[0] >> 0) & 0xFF;
2072 break;
2073 case 17: tmp0 = (buf1[0] >> 8) & 0xFF;
2074 break;
2075 case 18: tmp0 = (buf1[0] >> 16) & 0xFF;
2076 break;
2077 case 19: tmp0 = (buf1[0] >> 24) & 0xFF;
2078 break;
2079 case 20: tmp0 = (buf1[1] >> 0) & 0xFF;
2080 break;
2081 case 21: tmp0 = (buf1[1] >> 8) & 0xFF;
2082 break;
2083 case 22: tmp0 = (buf1[1] >> 16) & 0xFF;
2084 break;
2085 case 23: tmp0 = (buf1[1] >> 24) & 0xFF;
2086 break;
2087 case 24: tmp0 = (buf1[2] >> 0) & 0xFF;
2088 break;
2089 case 25: tmp0 = (buf1[2] >> 8) & 0xFF;
2090 break;
2091 case 26: tmp0 = (buf1[2] >> 16) & 0xFF;
2092 break;
2093 case 27: tmp0 = (buf1[2] >> 24) & 0xFF;
2094 break;
2095 case 28: tmp0 = (buf1[3] >> 0) & 0xFF;
2096 break;
2097 case 29: tmp0 = (buf1[3] >> 8) & 0xFF;
2098 break;
2099 case 30: tmp0 = (buf1[3] >> 16) & 0xFF;
2100 break;
2101 case 31: tmp0 = (buf1[3] >> 24) & 0xFF;
2102 break;
2103 }
2104
2105 switch (p1)
2106 {
2107 case 0: tmp1 = (buf0[0] >> 0) & 0xff;
2108 buf0[0] = (buf0[0] & 0xffffff00) | tmp0 << 0;
2109 break;
2110 case 1: tmp1 = (buf0[0] >> 8) & 0xff;
2111 buf0[0] = (buf0[0] & 0xffff00ff) | tmp0 << 8;
2112 break;
2113 case 2: tmp1 = (buf0[0] >> 16) & 0xff;
2114 buf0[0] = (buf0[0] & 0xff00ffff) | tmp0 << 16;
2115 break;
2116 case 3: tmp1 = (buf0[0] >> 24) & 0xff;
2117 buf0[0] = (buf0[0] & 0x00ffffff) | tmp0 << 24;
2118 break;
2119 case 4: tmp1 = (buf0[1] >> 0) & 0xff;
2120 buf0[1] = (buf0[1] & 0xffffff00) | tmp0 << 0;
2121 break;
2122 case 5: tmp1 = (buf0[1] >> 8) & 0xff;
2123 buf0[1] = (buf0[1] & 0xffff00ff) | tmp0 << 8;
2124 break;
2125 case 6: tmp1 = (buf0[1] >> 16) & 0xff;
2126 buf0[1] = (buf0[1] & 0xff00ffff) | tmp0 << 16;
2127 break;
2128 case 7: tmp1 = (buf0[1] >> 24) & 0xff;
2129 buf0[1] = (buf0[1] & 0x00ffffff) | tmp0 << 24;
2130 break;
2131 case 8: tmp1 = (buf0[2] >> 0) & 0xff;
2132 buf0[2] = (buf0[2] & 0xffffff00) | tmp0 << 0;
2133 break;
2134 case 9: tmp1 = (buf0[2] >> 8) & 0xff;
2135 buf0[2] = (buf0[2] & 0xffff00ff) | tmp0 << 8;
2136 break;
2137 case 10: tmp1 = (buf0[2] >> 16) & 0xff;
2138 buf0[2] = (buf0[2] & 0xff00ffff) | tmp0 << 16;
2139 break;
2140 case 11: tmp1 = (buf0[2] >> 24) & 0xff;
2141 buf0[2] = (buf0[2] & 0x00ffffff) | tmp0 << 24;
2142 break;
2143 case 12: tmp1 = (buf0[3] >> 0) & 0xff;
2144 buf0[3] = (buf0[3] & 0xffffff00) | tmp0 << 0;
2145 break;
2146 case 13: tmp1 = (buf0[3] >> 8) & 0xff;
2147 buf0[3] = (buf0[3] & 0xffff00ff) | tmp0 << 8;
2148 break;
2149 case 14: tmp1 = (buf0[3] >> 16) & 0xff;
2150 buf0[3] = (buf0[3] & 0xff00ffff) | tmp0 << 16;
2151 break;
2152 case 15: tmp1 = (buf0[3] >> 24) & 0xff;
2153 buf0[3] = (buf0[3] & 0x00ffffff) | tmp0 << 24;
2154 break;
2155 case 16: tmp1 = (buf1[0] >> 0) & 0xff;
2156 buf1[0] = (buf1[0] & 0xffffff00) | tmp0 << 0;
2157 break;
2158 case 17: tmp1 = (buf1[0] >> 8) & 0xff;
2159 buf1[0] = (buf1[0] & 0xffff00ff) | tmp0 << 8;
2160 break;
2161 case 18: tmp1 = (buf1[0] >> 16) & 0xff;
2162 buf1[0] = (buf1[0] & 0xff00ffff) | tmp0 << 16;
2163 break;
2164 case 19: tmp1 = (buf1[0] >> 24) & 0xff;
2165 buf1[0] = (buf1[0] & 0x00ffffff) | tmp0 << 24;
2166 break;
2167 case 20: tmp1 = (buf1[1] >> 0) & 0xff;
2168 buf1[1] = (buf1[1] & 0xffffff00) | tmp0 << 0;
2169 break;
2170 case 21: tmp1 = (buf1[1] >> 8) & 0xff;
2171 buf1[1] = (buf1[1] & 0xffff00ff) | tmp0 << 8;
2172 break;
2173 case 22: tmp1 = (buf1[1] >> 16) & 0xff;
2174 buf1[1] = (buf1[1] & 0xff00ffff) | tmp0 << 16;
2175 break;
2176 case 23: tmp1 = (buf1[1] >> 24) & 0xff;
2177 buf1[1] = (buf1[1] & 0x00ffffff) | tmp0 << 24;
2178 break;
2179 case 24: tmp1 = (buf1[2] >> 0) & 0xff;
2180 buf1[2] = (buf1[2] & 0xffffff00) | tmp0 << 0;
2181 break;
2182 case 25: tmp1 = (buf1[2] >> 8) & 0xff;
2183 buf1[2] = (buf1[2] & 0xffff00ff) | tmp0 << 8;
2184 break;
2185 case 26: tmp1 = (buf1[2] >> 16) & 0xff;
2186 buf1[2] = (buf1[2] & 0xff00ffff) | tmp0 << 16;
2187 break;
2188 case 27: tmp1 = (buf1[2] >> 24) & 0xff;
2189 buf1[2] = (buf1[2] & 0x00ffffff) | tmp0 << 24;
2190 break;
2191 case 28: tmp1 = (buf1[3] >> 0) & 0xff;
2192 buf1[3] = (buf1[3] & 0xffffff00) | tmp0 << 0;
2193 break;
2194 case 29: tmp1 = (buf1[3] >> 8) & 0xff;
2195 buf1[3] = (buf1[3] & 0xffff00ff) | tmp0 << 8;
2196 break;
2197 case 30: tmp1 = (buf1[3] >> 16) & 0xff;
2198 buf1[3] = (buf1[3] & 0xff00ffff) | tmp0 << 16;
2199 break;
2200 case 31: tmp1 = (buf1[3] >> 24) & 0xff;
2201 buf1[3] = (buf1[3] & 0x00ffffff) | tmp0 << 24;
2202 break;
2203 }
2204
2205 switch (p0)
2206 {
2207 case 0: buf0[0] = (buf0[0] & 0xffffff00) | tmp1 << 0;
2208 break;
2209 case 1: buf0[0] = (buf0[0] & 0xffff00ff) | tmp1 << 8;
2210 break;
2211 case 2: buf0[0] = (buf0[0] & 0xff00ffff) | tmp1 << 16;
2212 break;
2213 case 3: buf0[0] = (buf0[0] & 0x00ffffff) | tmp1 << 24;
2214 break;
2215 case 4: buf0[1] = (buf0[1] & 0xffffff00) | tmp1 << 0;
2216 break;
2217 case 5: buf0[1] = (buf0[1] & 0xffff00ff) | tmp1 << 8;
2218 break;
2219 case 6: buf0[1] = (buf0[1] & 0xff00ffff) | tmp1 << 16;
2220 break;
2221 case 7: buf0[1] = (buf0[1] & 0x00ffffff) | tmp1 << 24;
2222 break;
2223 case 8: buf0[2] = (buf0[2] & 0xffffff00) | tmp1 << 0;
2224 break;
2225 case 9: buf0[2] = (buf0[2] & 0xffff00ff) | tmp1 << 8;
2226 break;
2227 case 10: buf0[2] = (buf0[2] & 0xff00ffff) | tmp1 << 16;
2228 break;
2229 case 11: buf0[2] = (buf0[2] & 0x00ffffff) | tmp1 << 24;
2230 break;
2231 case 12: buf0[3] = (buf0[3] & 0xffffff00) | tmp1 << 0;
2232 break;
2233 case 13: buf0[3] = (buf0[3] & 0xffff00ff) | tmp1 << 8;
2234 break;
2235 case 14: buf0[3] = (buf0[3] & 0xff00ffff) | tmp1 << 16;
2236 break;
2237 case 15: buf0[3] = (buf0[3] & 0x00ffffff) | tmp1 << 24;
2238 break;
2239 case 16: buf1[0] = (buf1[0] & 0xffffff00) | tmp1 << 0;
2240 break;
2241 case 17: buf1[0] = (buf1[0] & 0xffff00ff) | tmp1 << 8;
2242 break;
2243 case 18: buf1[0] = (buf1[0] & 0xff00ffff) | tmp1 << 16;
2244 break;
2245 case 19: buf1[0] = (buf1[0] & 0x00ffffff) | tmp1 << 24;
2246 break;
2247 case 20: buf1[1] = (buf1[1] & 0xffffff00) | tmp1 << 0;
2248 break;
2249 case 21: buf1[1] = (buf1[1] & 0xffff00ff) | tmp1 << 8;
2250 break;
2251 case 22: buf1[1] = (buf1[1] & 0xff00ffff) | tmp1 << 16;
2252 break;
2253 case 23: buf1[1] = (buf1[1] & 0x00ffffff) | tmp1 << 24;
2254 break;
2255 case 24: buf1[2] = (buf1[2] & 0xffffff00) | tmp1 << 0;
2256 break;
2257 case 25: buf1[2] = (buf1[2] & 0xffff00ff) | tmp1 << 8;
2258 break;
2259 case 26: buf1[2] = (buf1[2] & 0xff00ffff) | tmp1 << 16;
2260 break;
2261 case 27: buf1[2] = (buf1[2] & 0x00ffffff) | tmp1 << 24;
2262 break;
2263 case 28: buf1[3] = (buf1[3] & 0xffffff00) | tmp1 << 0;
2264 break;
2265 case 29: buf1[3] = (buf1[3] & 0xffff00ff) | tmp1 << 8;
2266 break;
2267 case 30: buf1[3] = (buf1[3] & 0xff00ffff) | tmp1 << 16;
2268 break;
2269 case 31: buf1[3] = (buf1[3] & 0x00ffffff) | tmp1 << 24;
2270 break;
2271 }
2272
2273 return in_len;
2274 }
2275
2276 static u32 rule_op_mangle_chr_shiftl (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2277 {
2278 if (p0 >= in_len) return (in_len);
2279
2280 const u32 mr = 0xffu << ((p0 & 3) * 8);
2281 const u32 ml = ~mr;
2282
2283 switch (p0 / 4)
2284 {
2285 case 0: buf0[0] = (buf0[0] & ml) | (((buf0[0] & mr) << 1) & mr); break;
2286 case 1: buf0[1] = (buf0[1] & ml) | (((buf0[1] & mr) << 1) & mr); break;
2287 case 2: buf0[2] = (buf0[2] & ml) | (((buf0[2] & mr) << 1) & mr); break;
2288 case 3: buf0[3] = (buf0[3] & ml) | (((buf0[3] & mr) << 1) & mr); break;
2289 case 4: buf1[0] = (buf1[0] & ml) | (((buf1[0] & mr) << 1) & mr); break;
2290 case 5: buf1[1] = (buf1[1] & ml) | (((buf1[1] & mr) << 1) & mr); break;
2291 case 6: buf1[2] = (buf1[2] & ml) | (((buf1[2] & mr) << 1) & mr); break;
2292 case 7: buf1[3] = (buf1[3] & ml) | (((buf1[3] & mr) << 1) & mr); break;
2293 }
2294
2295 return in_len;
2296 }
2297
2298 static u32 rule_op_mangle_chr_shiftr (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2299 {
2300 if (p0 >= in_len) return (in_len);
2301
2302 const u32 mr = 0xffu << ((p0 & 3) * 8);
2303 const u32 ml = ~mr;
2304
2305 switch (p0 / 4)
2306 {
2307 case 0: buf0[0] = (buf0[0] & ml) | (((buf0[0] & mr) >> 1) & mr); break;
2308 case 1: buf0[1] = (buf0[1] & ml) | (((buf0[1] & mr) >> 1) & mr); break;
2309 case 2: buf0[2] = (buf0[2] & ml) | (((buf0[2] & mr) >> 1) & mr); break;
2310 case 3: buf0[3] = (buf0[3] & ml) | (((buf0[3] & mr) >> 1) & mr); break;
2311 case 4: buf1[0] = (buf1[0] & ml) | (((buf1[0] & mr) >> 1) & mr); break;
2312 case 5: buf1[1] = (buf1[1] & ml) | (((buf1[1] & mr) >> 1) & mr); break;
2313 case 6: buf1[2] = (buf1[2] & ml) | (((buf1[2] & mr) >> 1) & mr); break;
2314 case 7: buf1[3] = (buf1[3] & ml) | (((buf1[3] & mr) >> 1) & mr); break;
2315 }
2316
2317 return in_len;
2318 }
2319
2320 static u32 rule_op_mangle_chr_incr (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2321 {
2322 if (p0 >= in_len) return (in_len);
2323
2324 const u32 mr = 0xffu << ((p0 & 3) * 8);
2325 const u32 ml = ~mr;
2326
2327 const u32 n = 0x01010101 & mr;
2328
2329 switch (p0 / 4)
2330 {
2331 case 0: buf0[0] = (buf0[0] & ml) | (((buf0[0] & mr) + n) & mr); break;
2332 case 1: buf0[1] = (buf0[1] & ml) | (((buf0[1] & mr) + n) & mr); break;
2333 case 2: buf0[2] = (buf0[2] & ml) | (((buf0[2] & mr) + n) & mr); break;
2334 case 3: buf0[3] = (buf0[3] & ml) | (((buf0[3] & mr) + n) & mr); break;
2335 case 4: buf1[0] = (buf1[0] & ml) | (((buf1[0] & mr) + n) & mr); break;
2336 case 5: buf1[1] = (buf1[1] & ml) | (((buf1[1] & mr) + n) & mr); break;
2337 case 6: buf1[2] = (buf1[2] & ml) | (((buf1[2] & mr) + n) & mr); break;
2338 case 7: buf1[3] = (buf1[3] & ml) | (((buf1[3] & mr) + n) & mr); break;
2339 }
2340
2341 return in_len;
2342 }
2343
2344 static u32 rule_op_mangle_chr_decr (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2345 {
2346 if (p0 >= in_len) return (in_len);
2347
2348 const u32 mr = 0xffu << ((p0 & 3) * 8);
2349 const u32 ml = ~mr;
2350
2351 const u32 n = 0x01010101 & mr;
2352
2353 switch (p0 / 4)
2354 {
2355 case 0: buf0[0] = (buf0[0] & ml) | (((buf0[0] & mr) - n) & mr); break;
2356 case 1: buf0[1] = (buf0[1] & ml) | (((buf0[1] & mr) - n) & mr); break;
2357 case 2: buf0[2] = (buf0[2] & ml) | (((buf0[2] & mr) - n) & mr); break;
2358 case 3: buf0[3] = (buf0[3] & ml) | (((buf0[3] & mr) - n) & mr); break;
2359 case 4: buf1[0] = (buf1[0] & ml) | (((buf1[0] & mr) - n) & mr); break;
2360 case 5: buf1[1] = (buf1[1] & ml) | (((buf1[1] & mr) - n) & mr); break;
2361 case 6: buf1[2] = (buf1[2] & ml) | (((buf1[2] & mr) - n) & mr); break;
2362 case 7: buf1[3] = (buf1[3] & ml) | (((buf1[3] & mr) - n) & mr); break;
2363 }
2364
2365 return in_len;
2366 }
2367
2368 static u32 rule_op_mangle_replace_np1 (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2369 {
2370 if ((p0 + 1) >= in_len) return (in_len);
2371
2372 u32 tib40[4];
2373 u32 tib41[4];
2374
2375 lshift_block (buf0, buf1, tib40, tib41);
2376
2377 const u32 mr = 0xffu << ((p0 & 3) * 8);
2378 const u32 ml = ~mr;
2379
2380 switch (p0 / 4)
2381 {
2382 case 0: buf0[0] = (buf0[0] & ml) | (tib40[0] & mr); break;
2383 case 1: buf0[1] = (buf0[1] & ml) | (tib40[1] & mr); break;
2384 case 2: buf0[2] = (buf0[2] & ml) | (tib40[2] & mr); break;
2385 case 3: buf0[3] = (buf0[3] & ml) | (tib40[3] & mr); break;
2386 case 4: buf1[0] = (buf1[0] & ml) | (tib41[0] & mr); break;
2387 case 5: buf1[1] = (buf1[1] & ml) | (tib41[1] & mr); break;
2388 case 6: buf1[2] = (buf1[2] & ml) | (tib41[2] & mr); break;
2389 case 7: buf1[3] = (buf1[3] & ml) | (tib41[3] & mr); break;
2390 }
2391
2392 return in_len;
2393 }
2394
2395 static u32 rule_op_mangle_replace_nm1 (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2396 {
2397 if (p0 == 0) return (in_len);
2398
2399 if (p0 >= in_len) return (in_len);
2400
2401 u32 tib40[4];
2402 u32 tib41[4];
2403
2404 rshift_block (buf0, buf1, tib40, tib41);
2405
2406 const u32 mr = 0xffu << ((p0 & 3) * 8);
2407 const u32 ml = ~mr;
2408
2409 switch (p0 / 4)
2410 {
2411 case 0: buf0[0] = (buf0[0] & ml) | (tib40[0] & mr); break;
2412 case 1: buf0[1] = (buf0[1] & ml) | (tib40[1] & mr); break;
2413 case 2: buf0[2] = (buf0[2] & ml) | (tib40[2] & mr); break;
2414 case 3: buf0[3] = (buf0[3] & ml) | (tib40[3] & mr); break;
2415 case 4: buf1[0] = (buf1[0] & ml) | (tib41[0] & mr); break;
2416 case 5: buf1[1] = (buf1[1] & ml) | (tib41[1] & mr); break;
2417 case 6: buf1[2] = (buf1[2] & ml) | (tib41[2] & mr); break;
2418 case 7: buf1[3] = (buf1[3] & ml) | (tib41[3] & mr); break;
2419 }
2420
2421 return in_len;
2422 }
2423
2424 static u32 rule_op_mangle_dupeblock_first (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2425 {
2426 if (p0 > in_len) return (in_len);
2427
2428 if ((in_len + p0) >= 32) return (in_len);
2429
2430 u32 out_len = in_len;
2431
2432 u32 tib40[4];
2433 u32 tib41[4];
2434
2435 tib40[0] = buf0[0];
2436 tib40[1] = buf0[1];
2437 tib40[2] = buf0[2];
2438 tib40[3] = buf0[3];
2439 tib41[0] = buf1[0];
2440 tib41[1] = buf1[1];
2441 tib41[2] = buf1[2];
2442 tib41[3] = buf1[3];
2443
2444 truncate_right (tib40, tib41, p0);
2445
2446 rshift_block_N (buf0, buf1, buf0, buf1, p0);
2447
2448 buf0[0] |= tib40[0];
2449 buf0[1] |= tib40[1];
2450 buf0[2] |= tib40[2];
2451 buf0[3] |= tib40[3];
2452 buf1[0] |= tib41[0];
2453 buf1[1] |= tib41[1];
2454 buf1[2] |= tib41[2];
2455 buf1[3] |= tib41[3];
2456
2457 out_len += p0;
2458
2459 return out_len;
2460 }
2461
2462 static u32 rule_op_mangle_dupeblock_last (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2463 {
2464 if (p0 > in_len) return (in_len);
2465
2466 if ((in_len + p0) >= 32) return (in_len);
2467
2468 u32 out_len = in_len;
2469
2470 u32 tib40[4];
2471 u32 tib41[4];
2472
2473 rshift_block_N (buf0, buf1, tib40, tib41, p0);
2474
2475 truncate_left (tib40, tib41, out_len);
2476
2477 buf0[0] |= tib40[0];
2478 buf0[1] |= tib40[1];
2479 buf0[2] |= tib40[2];
2480 buf0[3] |= tib40[3];
2481 buf1[0] |= tib41[0];
2482 buf1[1] |= tib41[1];
2483 buf1[2] |= tib41[2];
2484 buf1[3] |= tib41[3];
2485
2486 out_len += p0;
2487
2488 return out_len;
2489 }
2490
2491 static u32 rule_op_mangle_title (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2492 {
2493 buf0[0] |= (generate_cmask (buf0[0]));
2494 buf0[1] |= (generate_cmask (buf0[1]));
2495 buf0[2] |= (generate_cmask (buf0[2]));
2496 buf0[3] |= (generate_cmask (buf0[3]));
2497 buf1[0] |= (generate_cmask (buf1[0]));
2498 buf1[1] |= (generate_cmask (buf1[1]));
2499 buf1[2] |= (generate_cmask (buf1[2]));
2500 buf1[3] |= (generate_cmask (buf1[3]));
2501
2502 buf0[0] &= ~(0x00000020 & generate_cmask (buf0[0]));
2503
2504 for (u32 i = 0; i < in_len; i++)
2505 {
2506 u32 tmp0 = 0;
2507 u32 tmp1 = 0;
2508
2509 switch (i)
2510 {
2511 case 0: tmp0 = (buf0[0] >> 0) & 0xFF;
2512 tmp1 = ~(0x00002000 & generate_cmask (buf0[0])); break;
2513 case 1: tmp0 = (buf0[0] >> 8) & 0xFF;
2514 tmp1 = ~(0x00200000 & generate_cmask (buf0[0])); break;
2515 case 2: tmp0 = (buf0[0] >> 16) & 0xFF;
2516 tmp1 = ~(0x20000000 & generate_cmask (buf0[0])); break;
2517 case 3: tmp0 = (buf0[0] >> 24) & 0xFF;
2518 tmp1 = ~(0x00000020 & generate_cmask (buf0[1])); break;
2519 case 4: tmp0 = (buf0[1] >> 0) & 0xFF;
2520 tmp1 = ~(0x00002000 & generate_cmask (buf0[1])); break;
2521 case 5: tmp0 = (buf0[1] >> 8) & 0xFF;
2522 tmp1 = ~(0x00200000 & generate_cmask (buf0[1])); break;
2523 case 6: tmp0 = (buf0[1] >> 16) & 0xFF;
2524 tmp1 = ~(0x20000000 & generate_cmask (buf0[1])); break;
2525 case 7: tmp0 = (buf0[1] >> 24) & 0xFF;
2526 tmp1 = ~(0x00000020 & generate_cmask (buf0[2])); break;
2527 case 8: tmp0 = (buf0[2] >> 0) & 0xFF;
2528 tmp1 = ~(0x00002000 & generate_cmask (buf0[2])); break;
2529 case 9: tmp0 = (buf0[2] >> 8) & 0xFF;
2530 tmp1 = ~(0x00200000 & generate_cmask (buf0[2])); break;
2531 case 10: tmp0 = (buf0[2] >> 16) & 0xFF;
2532 tmp1 = ~(0x20000000 & generate_cmask (buf0[2])); break;
2533 case 11: tmp0 = (buf0[2] >> 24) & 0xFF;
2534 tmp1 = ~(0x00000020 & generate_cmask (buf0[3])); break;
2535 case 12: tmp0 = (buf0[3] >> 0) & 0xFF;
2536 tmp1 = ~(0x00002000 & generate_cmask (buf0[3])); break;
2537 case 13: tmp0 = (buf0[3] >> 8) & 0xFF;
2538 tmp1 = ~(0x00200000 & generate_cmask (buf0[3])); break;
2539 case 14: tmp0 = (buf0[3] >> 16) & 0xFF;
2540 tmp1 = ~(0x20000000 & generate_cmask (buf0[3])); break;
2541 case 15: tmp0 = (buf0[3] >> 24) & 0xFF;
2542 tmp1 = ~(0x00000020 & generate_cmask (buf1[0])); break;
2543 case 16: tmp0 = (buf1[0] >> 0) & 0xFF;
2544 tmp1 = ~(0x00002000 & generate_cmask (buf1[0])); break;
2545 case 17: tmp0 = (buf1[0] >> 8) & 0xFF;
2546 tmp1 = ~(0x00200000 & generate_cmask (buf1[0])); break;
2547 case 18: tmp0 = (buf1[0] >> 16) & 0xFF;
2548 tmp1 = ~(0x20000000 & generate_cmask (buf1[0])); break;
2549 case 19: tmp0 = (buf1[0] >> 24) & 0xFF;
2550 tmp1 = ~(0x00000020 & generate_cmask (buf1[1])); break;
2551 case 20: tmp0 = (buf1[1] >> 0) & 0xFF;
2552 tmp1 = ~(0x00002000 & generate_cmask (buf1[1])); break;
2553 case 21: tmp0 = (buf1[1] >> 8) & 0xFF;
2554 tmp1 = ~(0x00200000 & generate_cmask (buf1[1])); break;
2555 case 22: tmp0 = (buf1[1] >> 16) & 0xFF;
2556 tmp1 = ~(0x20000000 & generate_cmask (buf1[1])); break;
2557 case 23: tmp0 = (buf1[1] >> 24) & 0xFF;
2558 tmp1 = ~(0x00000020 & generate_cmask (buf1[2])); break;
2559 case 24: tmp0 = (buf1[2] >> 0) & 0xFF;
2560 tmp1 = ~(0x00002000 & generate_cmask (buf1[2])); break;
2561 case 25: tmp0 = (buf1[2] >> 8) & 0xFF;
2562 tmp1 = ~(0x00200000 & generate_cmask (buf1[2])); break;
2563 case 26: tmp0 = (buf1[2] >> 16) & 0xFF;
2564 tmp1 = ~(0x20000000 & generate_cmask (buf1[2])); break;
2565 case 27: tmp0 = (buf1[2] >> 24) & 0xFF;
2566 tmp1 = ~(0x00000020 & generate_cmask (buf1[3])); break;
2567 case 28: tmp0 = (buf1[3] >> 0) & 0xFF;
2568 tmp1 = ~(0x00002000 & generate_cmask (buf1[3])); break;
2569 case 29: tmp0 = (buf1[3] >> 8) & 0xFF;
2570 tmp1 = ~(0x00200000 & generate_cmask (buf1[3])); break;
2571 case 30: tmp0 = (buf1[3] >> 16) & 0xFF;
2572 tmp1 = ~(0x20000000 & generate_cmask (buf1[3])); break;
2573 }
2574
2575 if (i < 3)
2576 {
2577 if (tmp0 == ' ') buf0[0] &= tmp1 ;
2578 }
2579 else if (i < 7)
2580 {
2581 if (tmp0 == ' ') buf0[1] &= tmp1 ;
2582 }
2583 else if (i < 11)
2584 {
2585 if (tmp0 == ' ') buf0[2] &= tmp1 ;
2586 }
2587 else if (i < 15)
2588 {
2589 if (tmp0 == ' ') buf0[3] &= tmp1 ;
2590 }
2591 else if (i < 19)
2592 {
2593 if (tmp0 == ' ') buf1[0] &= tmp1 ;
2594 }
2595 else if (i < 23)
2596 {
2597 if (tmp0 == ' ') buf1[1] &= tmp1 ;
2598 }
2599 else if (i < 27)
2600 {
2601 if (tmp0 == ' ') buf1[2] &= tmp1 ;
2602 }
2603 else if (i < 31)
2604 {
2605 if (tmp0 == ' ') buf1[3] &= tmp1 ;
2606 }
2607 }
2608
2609 return in_len;
2610 }
2611
2612 u32 apply_rule (const u32 name, const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2613 {
2614 u32 out_len = in_len;
2615
2616 switch (name)
2617 {
2618 case RULE_OP_MANGLE_LREST: out_len = rule_op_mangle_lrest (p0, p1, buf0, buf1, out_len); break;
2619 case RULE_OP_MANGLE_UREST: out_len = rule_op_mangle_urest (p0, p1, buf0, buf1, out_len); break;
2620 case RULE_OP_MANGLE_LREST_UFIRST: out_len = rule_op_mangle_lrest_ufirst (p0, p1, buf0, buf1, out_len); break;
2621 case RULE_OP_MANGLE_UREST_LFIRST: out_len = rule_op_mangle_urest_lfirst (p0, p1, buf0, buf1, out_len); break;
2622 case RULE_OP_MANGLE_TREST: out_len = rule_op_mangle_trest (p0, p1, buf0, buf1, out_len); break;
2623 case RULE_OP_MANGLE_TOGGLE_AT: out_len = rule_op_mangle_toggle_at (p0, p1, buf0, buf1, out_len); break;
2624 case RULE_OP_MANGLE_REVERSE: out_len = rule_op_mangle_reverse (p0, p1, buf0, buf1, out_len); break;
2625 case RULE_OP_MANGLE_DUPEWORD: out_len = rule_op_mangle_dupeword (p0, p1, buf0, buf1, out_len); break;
2626 case RULE_OP_MANGLE_DUPEWORD_TIMES: out_len = rule_op_mangle_dupeword_times (p0, p1, buf0, buf1, out_len); break;
2627 case RULE_OP_MANGLE_REFLECT: out_len = rule_op_mangle_reflect (p0, p1, buf0, buf1, out_len); break;
2628 case RULE_OP_MANGLE_APPEND: out_len = rule_op_mangle_append (p0, p1, buf0, buf1, out_len); break;
2629 case RULE_OP_MANGLE_PREPEND: out_len = rule_op_mangle_prepend (p0, p1, buf0, buf1, out_len); break;
2630 case RULE_OP_MANGLE_ROTATE_LEFT: out_len = rule_op_mangle_rotate_left (p0, p1, buf0, buf1, out_len); break;
2631 case RULE_OP_MANGLE_ROTATE_RIGHT: out_len = rule_op_mangle_rotate_right (p0, p1, buf0, buf1, out_len); break;
2632 case RULE_OP_MANGLE_DELETE_FIRST: out_len = rule_op_mangle_delete_first (p0, p1, buf0, buf1, out_len); break;
2633 case RULE_OP_MANGLE_DELETE_LAST: out_len = rule_op_mangle_delete_last (p0, p1, buf0, buf1, out_len); break;
2634 case RULE_OP_MANGLE_DELETE_AT: out_len = rule_op_mangle_delete_at (p0, p1, buf0, buf1, out_len); break;
2635 case RULE_OP_MANGLE_EXTRACT: out_len = rule_op_mangle_extract (p0, p1, buf0, buf1, out_len); break;
2636 case RULE_OP_MANGLE_OMIT: out_len = rule_op_mangle_omit (p0, p1, buf0, buf1, out_len); break;
2637 case RULE_OP_MANGLE_INSERT: out_len = rule_op_mangle_insert (p0, p1, buf0, buf1, out_len); break;
2638 case RULE_OP_MANGLE_OVERSTRIKE: out_len = rule_op_mangle_overstrike (p0, p1, buf0, buf1, out_len); break;
2639 case RULE_OP_MANGLE_TRUNCATE_AT: out_len = rule_op_mangle_truncate_at (p0, p1, buf0, buf1, out_len); break;
2640 case RULE_OP_MANGLE_REPLACE: out_len = rule_op_mangle_replace (p0, p1, buf0, buf1, out_len); break;
2641 //case RULE_OP_MANGLE_PURGECHAR: out_len = rule_op_mangle_purgechar (p0, p1, buf0, buf1, out_len); break;
2642 //case RULE_OP_MANGLE_TOGGLECASE_REC: out_len = rule_op_mangle_togglecase_rec (p0, p1, buf0, buf1, out_len); break;
2643 case RULE_OP_MANGLE_DUPECHAR_FIRST: out_len = rule_op_mangle_dupechar_first (p0, p1, buf0, buf1, out_len); break;
2644 case RULE_OP_MANGLE_DUPECHAR_LAST: out_len = rule_op_mangle_dupechar_last (p0, p1, buf0, buf1, out_len); break;
2645 case RULE_OP_MANGLE_DUPECHAR_ALL: out_len = rule_op_mangle_dupechar_all (p0, p1, buf0, buf1, out_len); break;
2646 case RULE_OP_MANGLE_SWITCH_FIRST: out_len = rule_op_mangle_switch_first (p0, p1, buf0, buf1, out_len); break;
2647 case RULE_OP_MANGLE_SWITCH_LAST: out_len = rule_op_mangle_switch_last (p0, p1, buf0, buf1, out_len); break;
2648 case RULE_OP_MANGLE_SWITCH_AT: out_len = rule_op_mangle_switch_at (p0, p1, buf0, buf1, out_len); break;
2649 case RULE_OP_MANGLE_CHR_SHIFTL: out_len = rule_op_mangle_chr_shiftl (p0, p1, buf0, buf1, out_len); break;
2650 case RULE_OP_MANGLE_CHR_SHIFTR: out_len = rule_op_mangle_chr_shiftr (p0, p1, buf0, buf1, out_len); break;
2651 case RULE_OP_MANGLE_CHR_INCR: out_len = rule_op_mangle_chr_incr (p0, p1, buf0, buf1, out_len); break;
2652 case RULE_OP_MANGLE_CHR_DECR: out_len = rule_op_mangle_chr_decr (p0, p1, buf0, buf1, out_len); break;
2653 case RULE_OP_MANGLE_REPLACE_NP1: out_len = rule_op_mangle_replace_np1 (p0, p1, buf0, buf1, out_len); break;
2654 case RULE_OP_MANGLE_REPLACE_NM1: out_len = rule_op_mangle_replace_nm1 (p0, p1, buf0, buf1, out_len); break;
2655 case RULE_OP_MANGLE_DUPEBLOCK_FIRST: out_len = rule_op_mangle_dupeblock_first (p0, p1, buf0, buf1, out_len); break;
2656 case RULE_OP_MANGLE_DUPEBLOCK_LAST: out_len = rule_op_mangle_dupeblock_last (p0, p1, buf0, buf1, out_len); break;
2657 case RULE_OP_MANGLE_TITLE: out_len = rule_op_mangle_title (p0, p1, buf0, buf1, out_len); break;
2658 }
2659
2660 return out_len;
2661 }
2662
2663 u32 apply_rules (u32 *cmds, u32 buf0[4], u32 buf1[4], const u32 len)
2664 {
2665 u32 out_len = len;
2666
2667 for (u32 i = 0; cmds[i] != 0; i++)
2668 {
2669 const u32 cmd = cmds[i];
2670
2671 const u32 name = (cmd >> 0) & 0xff;
2672 const u32 p0 = (cmd >> 8) & 0xff;
2673 const u32 p1 = (cmd >> 16) & 0xff;
2674
2675 out_len = apply_rule (name, p0, p1, buf0, buf1, out_len);
2676 }
2677
2678 return out_len;
2679 }