Add --mangle switch for mangling password before hashing
[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 = (1u << ((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 = ~((1u << ((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 = (1u << ((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 = (1u << ((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 = (1u << ((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 = (1u << ((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 static u32 rule_op_mangle_purgechar (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1667 {
1668 u32 out_len = 0;
1669
1670 u32 buf_in[8];
1671
1672 buf_in[0] = buf0[0];
1673 buf_in[1] = buf0[1];
1674 buf_in[2] = buf0[2];
1675 buf_in[3] = buf0[3];
1676 buf_in[4] = buf1[0];
1677 buf_in[5] = buf1[1];
1678 buf_in[6] = buf1[2];
1679 buf_in[7] = buf1[3];
1680
1681 u32 buf_out[8] = { 0 };
1682
1683 u8 *in = (u8 *) buf_in;
1684 u8 *out = (u8 *) buf_out;
1685
1686 for (u32 pos = 0; pos < in_len; pos++)
1687 {
1688 if (in[pos] == (u8) p0) continue;
1689
1690 out[out_len] = in[pos];
1691
1692 out_len++;
1693 }
1694
1695 buf0[0] = buf_out[0];
1696 buf0[1] = buf_out[1];
1697 buf0[2] = buf_out[2];
1698 buf0[3] = buf_out[3];
1699 buf1[0] = buf_out[4];
1700 buf1[1] = buf_out[5];
1701 buf1[2] = buf_out[6];
1702 buf1[3] = buf_out[7];
1703
1704 return out_len;
1705 }
1706
1707 /*
1708 static u32 rule_op_mangle_togglecase_rec (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1709 {
1710 // TODO
1711 return in_len;
1712 }
1713 */
1714
1715 static u32 rule_op_mangle_dupechar_first (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1716 {
1717 if ( in_len == 0) return (in_len);
1718 if ((in_len + p0) >= 32) return (in_len);
1719
1720 u32 out_len = in_len;
1721
1722 const u32 tmp = buf0[0] & 0xFF;
1723
1724 rshift_block_N (buf0, buf1, buf0, buf1, p0);
1725
1726 switch (p0)
1727 {
1728 case 1: buf0[0] |= tmp << 0;
1729 break;
1730 case 2: buf0[0] |= tmp << 0 | tmp << 8;
1731 break;
1732 case 3: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16;
1733 break;
1734 case 4: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1735 break;
1736 case 5: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1737 buf0[1] |= tmp << 0;
1738 break;
1739 case 6: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1740 buf0[1] |= tmp << 0 | tmp << 8;
1741 break;
1742 case 7: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1743 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16;
1744 break;
1745 case 8: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1746 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1747 break;
1748 case 9: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1749 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1750 buf0[2] |= tmp << 0;
1751 break;
1752 case 10: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1753 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1754 buf0[2] |= tmp << 0 | tmp << 8;
1755 break;
1756 case 11: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1757 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1758 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16;
1759 break;
1760 case 12: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1761 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1762 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1763 break;
1764 case 13: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1765 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1766 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1767 buf0[3] |= tmp << 0;
1768 break;
1769 case 14: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1770 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1771 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1772 buf0[3] |= tmp << 0 | tmp << 8;
1773 break;
1774 case 15: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1775 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1776 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1777 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16;
1778 break;
1779 case 16: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1780 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1781 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1782 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1783 break;
1784 case 17: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1785 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1786 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1787 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1788 buf1[0] |= tmp << 0;
1789 break;
1790 case 18: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1791 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1792 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1793 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1794 buf1[0] |= tmp << 0 | tmp << 8;
1795 break;
1796 case 19: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1797 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1798 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1799 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1800 buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16;
1801 break;
1802 case 20: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1803 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1804 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1805 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1806 buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1807 break;
1808 case 21: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1809 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1810 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1811 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1812 buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1813 buf1[1] |= tmp << 0;
1814 break;
1815 case 22: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1816 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1817 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1818 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1819 buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1820 buf1[1] |= tmp << 0 | tmp << 8;
1821 break;
1822 case 23: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1823 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1824 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1825 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1826 buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1827 buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16;
1828 break;
1829 case 24: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1830 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1831 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1832 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1833 buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1834 buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1835 break;
1836 case 25: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1837 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1838 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1839 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1840 buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1841 buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1842 buf1[2] |= tmp << 0;
1843 break;
1844 case 26: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1845 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1846 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1847 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1848 buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1849 buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1850 buf1[2] |= tmp << 0 | tmp << 8;
1851 break;
1852 case 27: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1853 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1854 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1855 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1856 buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1857 buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1858 buf1[2] |= tmp << 0 | tmp << 8 | tmp << 16;
1859 break;
1860 case 28: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1861 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1862 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1863 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1864 buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1865 buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1866 buf1[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1867 break;
1868 case 29: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1869 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1870 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1871 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1872 buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1873 buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1874 buf1[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1875 buf1[3] |= tmp << 0;
1876 break;
1877 case 30: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1878 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1879 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1880 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1881 buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1882 buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1883 buf1[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1884 buf1[3] |= tmp << 0 | tmp << 8;
1885 break;
1886 case 31: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1887 buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1888 buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1889 buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1890 buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1891 buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1892 buf1[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24;
1893 buf1[3] |= tmp << 0 | tmp << 8 | tmp << 16;
1894 break;
1895 }
1896
1897 out_len += p0;
1898
1899 return out_len;
1900 }
1901
1902 static u32 rule_op_mangle_dupechar_last (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 + p0) >= 32) return (in_len);
1906
1907 const u32 in_len1 = in_len - 1;
1908
1909 const u32 sh = (in_len1 & 3) * 8;
1910
1911 u32 tmp = 0;
1912
1913 switch (in_len1 / 4)
1914 {
1915 case 0: tmp = (buf0[0] >> sh) & 0xff; break;
1916 case 1: tmp = (buf0[1] >> sh) & 0xff; break;
1917 case 2: tmp = (buf0[2] >> sh) & 0xff; break;
1918 case 3: tmp = (buf0[3] >> sh) & 0xff; break;
1919 case 4: tmp = (buf1[0] >> sh) & 0xff; break;
1920 case 5: tmp = (buf1[1] >> sh) & 0xff; break;
1921 case 6: tmp = (buf1[2] >> sh) & 0xff; break;
1922 case 7: tmp = (buf1[3] >> sh) & 0xff; break;
1923 }
1924
1925 u32 out_len = in_len;
1926
1927 for (u32 i = 0; i < p0; i++)
1928 {
1929 append_block1 (out_len, buf0, buf1, tmp);
1930
1931 out_len++;
1932 }
1933
1934 return out_len;
1935 }
1936
1937 static u32 rule_op_mangle_dupechar_all (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1938 {
1939 if ( in_len == 0) return (in_len);
1940 if ((in_len + in_len) >= 32) return (in_len);
1941
1942 u32 out_len = in_len;
1943
1944 u32 tib40[4];
1945 u32 tib41[4];
1946
1947 tib40[0] = ((buf0[0] & 0x000000FF) << 0) | ((buf0[0] & 0x0000FF00) << 8);
1948 tib40[1] = ((buf0[0] & 0x00FF0000) >> 16) | ((buf0[0] & 0xFF000000) >> 8);
1949 tib40[2] = ((buf0[1] & 0x000000FF) << 0) | ((buf0[1] & 0x0000FF00) << 8);
1950 tib40[3] = ((buf0[1] & 0x00FF0000) >> 16) | ((buf0[1] & 0xFF000000) >> 8);
1951 tib41[0] = ((buf0[2] & 0x000000FF) << 0) | ((buf0[2] & 0x0000FF00) << 8);
1952 tib41[1] = ((buf0[2] & 0x00FF0000) >> 16) | ((buf0[2] & 0xFF000000) >> 8);
1953 tib41[2] = ((buf0[3] & 0x000000FF) << 0) | ((buf0[3] & 0x0000FF00) << 8);
1954 tib41[3] = ((buf0[3] & 0x00FF0000) >> 16) | ((buf0[3] & 0xFF000000) >> 8);
1955
1956 buf0[0] = tib40[0] | (tib40[0] << 8);
1957 buf0[1] = tib40[1] | (tib40[1] << 8);
1958 buf0[2] = tib40[2] | (tib40[2] << 8);
1959 buf0[3] = tib40[3] | (tib40[3] << 8);
1960 buf1[0] = tib41[0] | (tib41[0] << 8);
1961 buf1[1] = tib41[1] | (tib41[1] << 8);
1962 buf1[2] = tib41[2] | (tib41[2] << 8);
1963 buf1[3] = tib41[3] | (tib41[3] << 8);
1964
1965 out_len = out_len + out_len;
1966
1967 return out_len;
1968 }
1969
1970 static u32 rule_op_mangle_switch_first (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1971 {
1972 if (in_len < 2) return (in_len);
1973
1974 buf0[0] = (buf0[0] & 0xFFFF0000) | ((buf0[0] << 8) & 0x0000FF00) | ((buf0[0] >> 8) & 0x000000FF);
1975
1976 return in_len;
1977 }
1978
1979 static u32 rule_op_mangle_switch_last (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
1980 {
1981 if (in_len < 2) return (in_len);
1982
1983 switch (in_len)
1984 {
1985 case 2: buf0[0] = ((buf0[0] << 8) & 0x0000FF00) | ((buf0[0] >> 8) & 0x000000FF);
1986 break;
1987 case 3: buf0[0] = (buf0[0] & 0x000000FF) | ((buf0[0] << 8) & 0x00FF0000) | ((buf0[0] >> 8) & 0x0000FF00);
1988 break;
1989 case 4: buf0[0] = (buf0[0] & 0x0000FFFF) | ((buf0[0] << 8) & 0xFF000000) | ((buf0[0] >> 8) & 0x00FF0000);
1990 break;
1991 case 5: buf0[1] = (buf0[0] & 0xFF000000) | buf0[1];
1992 buf0[0] = (buf0[0] & 0x00FFFFFF) | (buf0[1] << 24);
1993 buf0[1] = (buf0[1] >> 24);
1994 break;
1995 case 6: buf0[1] = ((buf0[1] << 8) & 0x0000FF00) | ((buf0[1] >> 8) & 0x000000FF);
1996 break;
1997 case 7: buf0[1] = (buf0[1] & 0x000000FF) | ((buf0[1] << 8) & 0x00FF0000) | ((buf0[1] >> 8) & 0x0000FF00);
1998 break;
1999 case 8: buf0[1] = (buf0[1] & 0x0000FFFF) | ((buf0[1] << 8) & 0xFF000000) | ((buf0[1] >> 8) & 0x00FF0000);
2000 break;
2001 case 9: buf0[2] = (buf0[1] & 0xFF000000) | buf0[2];
2002 buf0[1] = (buf0[1] & 0x00FFFFFF) | (buf0[2] << 24);
2003 buf0[2] = (buf0[2] >> 24);
2004 break;
2005 case 10: buf0[2] = ((buf0[2] << 8) & 0x0000FF00) | ((buf0[2] >> 8) & 0x000000FF);
2006 break;
2007 case 11: buf0[2] = (buf0[2] & 0x000000FF) | ((buf0[2] << 8) & 0x00FF0000) | ((buf0[2] >> 8) & 0x0000FF00);
2008 break;
2009 case 12: buf0[2] = (buf0[2] & 0x0000FFFF) | ((buf0[2] << 8) & 0xFF000000) | ((buf0[2] >> 8) & 0x00FF0000);
2010 break;
2011 case 13: buf0[3] = (buf0[2] & 0xFF000000) | buf0[3];
2012 buf0[2] = (buf0[2] & 0x00FFFFFF) | (buf0[3] << 24);
2013 buf0[3] = (buf0[3] >> 24);
2014 break;
2015 case 14: buf0[3] = ((buf0[3] << 8) & 0x0000FF00) | ((buf0[3] >> 8) & 0x000000FF);
2016 break;
2017 case 15: buf0[3] = (buf0[3] & 0x000000FF) | ((buf0[3] << 8) & 0x00FF0000) | ((buf0[3] >> 8) & 0x0000FF00);
2018 break;
2019 case 16: buf0[3] = (buf0[3] & 0x0000FFFF) | ((buf0[3] << 8) & 0xFF000000) | ((buf0[3] >> 8) & 0x00FF0000);
2020 break;
2021 case 17: buf1[0] = (buf0[3] & 0xFF000000) | buf1[0];
2022 buf0[3] = (buf0[3] & 0x00FFFFFF) | (buf1[0] << 24);
2023 buf1[0] = (buf1[0] >> 24);
2024 break;
2025 case 18: buf1[0] = ((buf1[0] << 8) & 0x0000FF00) | ((buf1[0] >> 8) & 0x000000FF);
2026 break;
2027 case 19: buf1[0] = (buf1[0] & 0x000000FF) | ((buf1[0] << 8) & 0x00FF0000) | ((buf1[0] >> 8) & 0x0000FF00);
2028 break;
2029 case 20: buf1[0] = (buf1[0] & 0x0000FFFF) | ((buf1[0] << 8) & 0xFF000000) | ((buf1[0] >> 8) & 0x00FF0000);
2030 break;
2031 case 21: buf1[1] = (buf1[0] & 0xFF000000) | buf1[1];
2032 buf1[0] = (buf1[0] & 0x00FFFFFF) | (buf1[1] << 24);
2033 buf1[1] = (buf1[1] >> 24);
2034 break;
2035 case 22: buf1[1] = ((buf1[1] << 8) & 0x0000FF00) | ((buf1[1] >> 8) & 0x000000FF);
2036 break;
2037 case 23: buf1[1] = (buf1[1] & 0x000000FF) | ((buf1[1] << 8) & 0x00FF0000) | ((buf1[1] >> 8) & 0x0000FF00);
2038 break;
2039 case 24: buf1[1] = (buf1[1] & 0x0000FFFF) | ((buf1[1] << 8) & 0xFF000000) | ((buf1[1] >> 8) & 0x00FF0000);
2040 break;
2041 case 25: buf1[2] = (buf1[1] & 0xFF000000) | buf1[2];
2042 buf1[1] = (buf1[1] & 0x00FFFFFF) | (buf1[2] << 24);
2043 buf1[2] = (buf1[2] >> 24);
2044 break;
2045 case 26: buf1[2] = ((buf1[2] << 8) & 0x0000FF00) | ((buf1[2] >> 8) & 0x000000FF);
2046 break;
2047 case 27: buf1[2] = (buf1[2] & 0x000000FF) | ((buf1[2] << 8) & 0x00FF0000) | ((buf1[2] >> 8) & 0x0000FF00);
2048 break;
2049 case 28: buf1[2] = (buf1[2] & 0x0000FFFF) | ((buf1[2] << 8) & 0xFF000000) | ((buf1[2] >> 8) & 0x00FF0000);
2050 break;
2051 case 29: buf1[3] = (buf1[2] & 0xFF000000) | buf1[3];
2052 buf1[2] = (buf1[2] & 0x00FFFFFF) | (buf1[3] << 24);
2053 buf1[3] = (buf1[3] >> 24);
2054 break;
2055 case 30: buf1[3] = ((buf1[3] << 8) & 0x0000FF00) | ((buf1[3] >> 8) & 0x000000FF);
2056 break;
2057 case 31: buf1[3] = (buf1[3] & 0x000000FF) | ((buf1[3] << 8) & 0x00FF0000) | ((buf1[3] >> 8) & 0x0000FF00);
2058 break;
2059 }
2060
2061 return in_len;
2062 }
2063
2064 static u32 rule_op_mangle_switch_at (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2065 {
2066 if (p0 >= in_len) return (in_len);
2067 if (p1 >= in_len) return (in_len);
2068
2069 u32 tmp0 = 0;
2070 u32 tmp1 = 0;
2071
2072 switch (p0)
2073 {
2074 case 0: tmp0 = (buf0[0] >> 0) & 0xFF;
2075 break;
2076 case 1: tmp0 = (buf0[0] >> 8) & 0xFF;
2077 break;
2078 case 2: tmp0 = (buf0[0] >> 16) & 0xFF;
2079 break;
2080 case 3: tmp0 = (buf0[0] >> 24) & 0xFF;
2081 break;
2082 case 4: tmp0 = (buf0[1] >> 0) & 0xFF;
2083 break;
2084 case 5: tmp0 = (buf0[1] >> 8) & 0xFF;
2085 break;
2086 case 6: tmp0 = (buf0[1] >> 16) & 0xFF;
2087 break;
2088 case 7: tmp0 = (buf0[1] >> 24) & 0xFF;
2089 break;
2090 case 8: tmp0 = (buf0[2] >> 0) & 0xFF;
2091 break;
2092 case 9: tmp0 = (buf0[2] >> 8) & 0xFF;
2093 break;
2094 case 10: tmp0 = (buf0[2] >> 16) & 0xFF;
2095 break;
2096 case 11: tmp0 = (buf0[2] >> 24) & 0xFF;
2097 break;
2098 case 12: tmp0 = (buf0[3] >> 0) & 0xFF;
2099 break;
2100 case 13: tmp0 = (buf0[3] >> 8) & 0xFF;
2101 break;
2102 case 14: tmp0 = (buf0[3] >> 16) & 0xFF;
2103 break;
2104 case 15: tmp0 = (buf0[3] >> 24) & 0xFF;
2105 break;
2106 case 16: tmp0 = (buf1[0] >> 0) & 0xFF;
2107 break;
2108 case 17: tmp0 = (buf1[0] >> 8) & 0xFF;
2109 break;
2110 case 18: tmp0 = (buf1[0] >> 16) & 0xFF;
2111 break;
2112 case 19: tmp0 = (buf1[0] >> 24) & 0xFF;
2113 break;
2114 case 20: tmp0 = (buf1[1] >> 0) & 0xFF;
2115 break;
2116 case 21: tmp0 = (buf1[1] >> 8) & 0xFF;
2117 break;
2118 case 22: tmp0 = (buf1[1] >> 16) & 0xFF;
2119 break;
2120 case 23: tmp0 = (buf1[1] >> 24) & 0xFF;
2121 break;
2122 case 24: tmp0 = (buf1[2] >> 0) & 0xFF;
2123 break;
2124 case 25: tmp0 = (buf1[2] >> 8) & 0xFF;
2125 break;
2126 case 26: tmp0 = (buf1[2] >> 16) & 0xFF;
2127 break;
2128 case 27: tmp0 = (buf1[2] >> 24) & 0xFF;
2129 break;
2130 case 28: tmp0 = (buf1[3] >> 0) & 0xFF;
2131 break;
2132 case 29: tmp0 = (buf1[3] >> 8) & 0xFF;
2133 break;
2134 case 30: tmp0 = (buf1[3] >> 16) & 0xFF;
2135 break;
2136 case 31: tmp0 = (buf1[3] >> 24) & 0xFF;
2137 break;
2138 }
2139
2140 switch (p1)
2141 {
2142 case 0: tmp1 = (buf0[0] >> 0) & 0xff;
2143 buf0[0] = (buf0[0] & 0xffffff00) | tmp0 << 0;
2144 break;
2145 case 1: tmp1 = (buf0[0] >> 8) & 0xff;
2146 buf0[0] = (buf0[0] & 0xffff00ff) | tmp0 << 8;
2147 break;
2148 case 2: tmp1 = (buf0[0] >> 16) & 0xff;
2149 buf0[0] = (buf0[0] & 0xff00ffff) | tmp0 << 16;
2150 break;
2151 case 3: tmp1 = (buf0[0] >> 24) & 0xff;
2152 buf0[0] = (buf0[0] & 0x00ffffff) | tmp0 << 24;
2153 break;
2154 case 4: tmp1 = (buf0[1] >> 0) & 0xff;
2155 buf0[1] = (buf0[1] & 0xffffff00) | tmp0 << 0;
2156 break;
2157 case 5: tmp1 = (buf0[1] >> 8) & 0xff;
2158 buf0[1] = (buf0[1] & 0xffff00ff) | tmp0 << 8;
2159 break;
2160 case 6: tmp1 = (buf0[1] >> 16) & 0xff;
2161 buf0[1] = (buf0[1] & 0xff00ffff) | tmp0 << 16;
2162 break;
2163 case 7: tmp1 = (buf0[1] >> 24) & 0xff;
2164 buf0[1] = (buf0[1] & 0x00ffffff) | tmp0 << 24;
2165 break;
2166 case 8: tmp1 = (buf0[2] >> 0) & 0xff;
2167 buf0[2] = (buf0[2] & 0xffffff00) | tmp0 << 0;
2168 break;
2169 case 9: tmp1 = (buf0[2] >> 8) & 0xff;
2170 buf0[2] = (buf0[2] & 0xffff00ff) | tmp0 << 8;
2171 break;
2172 case 10: tmp1 = (buf0[2] >> 16) & 0xff;
2173 buf0[2] = (buf0[2] & 0xff00ffff) | tmp0 << 16;
2174 break;
2175 case 11: tmp1 = (buf0[2] >> 24) & 0xff;
2176 buf0[2] = (buf0[2] & 0x00ffffff) | tmp0 << 24;
2177 break;
2178 case 12: tmp1 = (buf0[3] >> 0) & 0xff;
2179 buf0[3] = (buf0[3] & 0xffffff00) | tmp0 << 0;
2180 break;
2181 case 13: tmp1 = (buf0[3] >> 8) & 0xff;
2182 buf0[3] = (buf0[3] & 0xffff00ff) | tmp0 << 8;
2183 break;
2184 case 14: tmp1 = (buf0[3] >> 16) & 0xff;
2185 buf0[3] = (buf0[3] & 0xff00ffff) | tmp0 << 16;
2186 break;
2187 case 15: tmp1 = (buf0[3] >> 24) & 0xff;
2188 buf0[3] = (buf0[3] & 0x00ffffff) | tmp0 << 24;
2189 break;
2190 case 16: tmp1 = (buf1[0] >> 0) & 0xff;
2191 buf1[0] = (buf1[0] & 0xffffff00) | tmp0 << 0;
2192 break;
2193 case 17: tmp1 = (buf1[0] >> 8) & 0xff;
2194 buf1[0] = (buf1[0] & 0xffff00ff) | tmp0 << 8;
2195 break;
2196 case 18: tmp1 = (buf1[0] >> 16) & 0xff;
2197 buf1[0] = (buf1[0] & 0xff00ffff) | tmp0 << 16;
2198 break;
2199 case 19: tmp1 = (buf1[0] >> 24) & 0xff;
2200 buf1[0] = (buf1[0] & 0x00ffffff) | tmp0 << 24;
2201 break;
2202 case 20: tmp1 = (buf1[1] >> 0) & 0xff;
2203 buf1[1] = (buf1[1] & 0xffffff00) | tmp0 << 0;
2204 break;
2205 case 21: tmp1 = (buf1[1] >> 8) & 0xff;
2206 buf1[1] = (buf1[1] & 0xffff00ff) | tmp0 << 8;
2207 break;
2208 case 22: tmp1 = (buf1[1] >> 16) & 0xff;
2209 buf1[1] = (buf1[1] & 0xff00ffff) | tmp0 << 16;
2210 break;
2211 case 23: tmp1 = (buf1[1] >> 24) & 0xff;
2212 buf1[1] = (buf1[1] & 0x00ffffff) | tmp0 << 24;
2213 break;
2214 case 24: tmp1 = (buf1[2] >> 0) & 0xff;
2215 buf1[2] = (buf1[2] & 0xffffff00) | tmp0 << 0;
2216 break;
2217 case 25: tmp1 = (buf1[2] >> 8) & 0xff;
2218 buf1[2] = (buf1[2] & 0xffff00ff) | tmp0 << 8;
2219 break;
2220 case 26: tmp1 = (buf1[2] >> 16) & 0xff;
2221 buf1[2] = (buf1[2] & 0xff00ffff) | tmp0 << 16;
2222 break;
2223 case 27: tmp1 = (buf1[2] >> 24) & 0xff;
2224 buf1[2] = (buf1[2] & 0x00ffffff) | tmp0 << 24;
2225 break;
2226 case 28: tmp1 = (buf1[3] >> 0) & 0xff;
2227 buf1[3] = (buf1[3] & 0xffffff00) | tmp0 << 0;
2228 break;
2229 case 29: tmp1 = (buf1[3] >> 8) & 0xff;
2230 buf1[3] = (buf1[3] & 0xffff00ff) | tmp0 << 8;
2231 break;
2232 case 30: tmp1 = (buf1[3] >> 16) & 0xff;
2233 buf1[3] = (buf1[3] & 0xff00ffff) | tmp0 << 16;
2234 break;
2235 case 31: tmp1 = (buf1[3] >> 24) & 0xff;
2236 buf1[3] = (buf1[3] & 0x00ffffff) | tmp0 << 24;
2237 break;
2238 }
2239
2240 switch (p0)
2241 {
2242 case 0: buf0[0] = (buf0[0] & 0xffffff00) | tmp1 << 0;
2243 break;
2244 case 1: buf0[0] = (buf0[0] & 0xffff00ff) | tmp1 << 8;
2245 break;
2246 case 2: buf0[0] = (buf0[0] & 0xff00ffff) | tmp1 << 16;
2247 break;
2248 case 3: buf0[0] = (buf0[0] & 0x00ffffff) | tmp1 << 24;
2249 break;
2250 case 4: buf0[1] = (buf0[1] & 0xffffff00) | tmp1 << 0;
2251 break;
2252 case 5: buf0[1] = (buf0[1] & 0xffff00ff) | tmp1 << 8;
2253 break;
2254 case 6: buf0[1] = (buf0[1] & 0xff00ffff) | tmp1 << 16;
2255 break;
2256 case 7: buf0[1] = (buf0[1] & 0x00ffffff) | tmp1 << 24;
2257 break;
2258 case 8: buf0[2] = (buf0[2] & 0xffffff00) | tmp1 << 0;
2259 break;
2260 case 9: buf0[2] = (buf0[2] & 0xffff00ff) | tmp1 << 8;
2261 break;
2262 case 10: buf0[2] = (buf0[2] & 0xff00ffff) | tmp1 << 16;
2263 break;
2264 case 11: buf0[2] = (buf0[2] & 0x00ffffff) | tmp1 << 24;
2265 break;
2266 case 12: buf0[3] = (buf0[3] & 0xffffff00) | tmp1 << 0;
2267 break;
2268 case 13: buf0[3] = (buf0[3] & 0xffff00ff) | tmp1 << 8;
2269 break;
2270 case 14: buf0[3] = (buf0[3] & 0xff00ffff) | tmp1 << 16;
2271 break;
2272 case 15: buf0[3] = (buf0[3] & 0x00ffffff) | tmp1 << 24;
2273 break;
2274 case 16: buf1[0] = (buf1[0] & 0xffffff00) | tmp1 << 0;
2275 break;
2276 case 17: buf1[0] = (buf1[0] & 0xffff00ff) | tmp1 << 8;
2277 break;
2278 case 18: buf1[0] = (buf1[0] & 0xff00ffff) | tmp1 << 16;
2279 break;
2280 case 19: buf1[0] = (buf1[0] & 0x00ffffff) | tmp1 << 24;
2281 break;
2282 case 20: buf1[1] = (buf1[1] & 0xffffff00) | tmp1 << 0;
2283 break;
2284 case 21: buf1[1] = (buf1[1] & 0xffff00ff) | tmp1 << 8;
2285 break;
2286 case 22: buf1[1] = (buf1[1] & 0xff00ffff) | tmp1 << 16;
2287 break;
2288 case 23: buf1[1] = (buf1[1] & 0x00ffffff) | tmp1 << 24;
2289 break;
2290 case 24: buf1[2] = (buf1[2] & 0xffffff00) | tmp1 << 0;
2291 break;
2292 case 25: buf1[2] = (buf1[2] & 0xffff00ff) | tmp1 << 8;
2293 break;
2294 case 26: buf1[2] = (buf1[2] & 0xff00ffff) | tmp1 << 16;
2295 break;
2296 case 27: buf1[2] = (buf1[2] & 0x00ffffff) | tmp1 << 24;
2297 break;
2298 case 28: buf1[3] = (buf1[3] & 0xffffff00) | tmp1 << 0;
2299 break;
2300 case 29: buf1[3] = (buf1[3] & 0xffff00ff) | tmp1 << 8;
2301 break;
2302 case 30: buf1[3] = (buf1[3] & 0xff00ffff) | tmp1 << 16;
2303 break;
2304 case 31: buf1[3] = (buf1[3] & 0x00ffffff) | tmp1 << 24;
2305 break;
2306 }
2307
2308 return in_len;
2309 }
2310
2311 static u32 rule_op_mangle_chr_shiftl (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2312 {
2313 if (p0 >= in_len) return (in_len);
2314
2315 const u32 mr = 0xffu << ((p0 & 3) * 8);
2316 const u32 ml = ~mr;
2317
2318 switch (p0 / 4)
2319 {
2320 case 0: buf0[0] = (buf0[0] & ml) | (((buf0[0] & mr) << 1) & mr); break;
2321 case 1: buf0[1] = (buf0[1] & ml) | (((buf0[1] & mr) << 1) & mr); break;
2322 case 2: buf0[2] = (buf0[2] & ml) | (((buf0[2] & mr) << 1) & mr); break;
2323 case 3: buf0[3] = (buf0[3] & ml) | (((buf0[3] & mr) << 1) & mr); break;
2324 case 4: buf1[0] = (buf1[0] & ml) | (((buf1[0] & mr) << 1) & mr); break;
2325 case 5: buf1[1] = (buf1[1] & ml) | (((buf1[1] & mr) << 1) & mr); break;
2326 case 6: buf1[2] = (buf1[2] & ml) | (((buf1[2] & mr) << 1) & mr); break;
2327 case 7: buf1[3] = (buf1[3] & ml) | (((buf1[3] & mr) << 1) & mr); break;
2328 }
2329
2330 return in_len;
2331 }
2332
2333 static u32 rule_op_mangle_chr_shiftr (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2334 {
2335 if (p0 >= in_len) return (in_len);
2336
2337 const u32 mr = 0xffu << ((p0 & 3) * 8);
2338 const u32 ml = ~mr;
2339
2340 switch (p0 / 4)
2341 {
2342 case 0: buf0[0] = (buf0[0] & ml) | (((buf0[0] & mr) >> 1) & mr); break;
2343 case 1: buf0[1] = (buf0[1] & ml) | (((buf0[1] & mr) >> 1) & mr); break;
2344 case 2: buf0[2] = (buf0[2] & ml) | (((buf0[2] & mr) >> 1) & mr); break;
2345 case 3: buf0[3] = (buf0[3] & ml) | (((buf0[3] & mr) >> 1) & mr); break;
2346 case 4: buf1[0] = (buf1[0] & ml) | (((buf1[0] & mr) >> 1) & mr); break;
2347 case 5: buf1[1] = (buf1[1] & ml) | (((buf1[1] & mr) >> 1) & mr); break;
2348 case 6: buf1[2] = (buf1[2] & ml) | (((buf1[2] & mr) >> 1) & mr); break;
2349 case 7: buf1[3] = (buf1[3] & ml) | (((buf1[3] & mr) >> 1) & mr); break;
2350 }
2351
2352 return in_len;
2353 }
2354
2355 static u32 rule_op_mangle_chr_incr (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2356 {
2357 if (p0 >= in_len) return (in_len);
2358
2359 const u32 mr = 0xffu << ((p0 & 3) * 8);
2360 const u32 ml = ~mr;
2361
2362 const u32 n = 0x01010101 & mr;
2363
2364 switch (p0 / 4)
2365 {
2366 case 0: buf0[0] = (buf0[0] & ml) | (((buf0[0] & mr) + n) & mr); break;
2367 case 1: buf0[1] = (buf0[1] & ml) | (((buf0[1] & mr) + n) & mr); break;
2368 case 2: buf0[2] = (buf0[2] & ml) | (((buf0[2] & mr) + n) & mr); break;
2369 case 3: buf0[3] = (buf0[3] & ml) | (((buf0[3] & mr) + n) & mr); break;
2370 case 4: buf1[0] = (buf1[0] & ml) | (((buf1[0] & mr) + n) & mr); break;
2371 case 5: buf1[1] = (buf1[1] & ml) | (((buf1[1] & mr) + n) & mr); break;
2372 case 6: buf1[2] = (buf1[2] & ml) | (((buf1[2] & mr) + n) & mr); break;
2373 case 7: buf1[3] = (buf1[3] & ml) | (((buf1[3] & mr) + n) & mr); break;
2374 }
2375
2376 return in_len;
2377 }
2378
2379 static u32 rule_op_mangle_chr_decr (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2380 {
2381 if (p0 >= in_len) return (in_len);
2382
2383 const u32 mr = 0xffu << ((p0 & 3) * 8);
2384 const u32 ml = ~mr;
2385
2386 const u32 n = 0x01010101 & mr;
2387
2388 switch (p0 / 4)
2389 {
2390 case 0: buf0[0] = (buf0[0] & ml) | (((buf0[0] & mr) - n) & mr); break;
2391 case 1: buf0[1] = (buf0[1] & ml) | (((buf0[1] & mr) - n) & mr); break;
2392 case 2: buf0[2] = (buf0[2] & ml) | (((buf0[2] & mr) - n) & mr); break;
2393 case 3: buf0[3] = (buf0[3] & ml) | (((buf0[3] & mr) - n) & mr); break;
2394 case 4: buf1[0] = (buf1[0] & ml) | (((buf1[0] & mr) - n) & mr); break;
2395 case 5: buf1[1] = (buf1[1] & ml) | (((buf1[1] & mr) - n) & mr); break;
2396 case 6: buf1[2] = (buf1[2] & ml) | (((buf1[2] & mr) - n) & mr); break;
2397 case 7: buf1[3] = (buf1[3] & ml) | (((buf1[3] & mr) - n) & mr); break;
2398 }
2399
2400 return in_len;
2401 }
2402
2403 static u32 rule_op_mangle_replace_np1 (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2404 {
2405 if ((p0 + 1) >= in_len) return (in_len);
2406
2407 u32 tib40[4];
2408 u32 tib41[4];
2409
2410 lshift_block (buf0, buf1, tib40, tib41);
2411
2412 const u32 mr = 0xffu << ((p0 & 3) * 8);
2413 const u32 ml = ~mr;
2414
2415 switch (p0 / 4)
2416 {
2417 case 0: buf0[0] = (buf0[0] & ml) | (tib40[0] & mr); break;
2418 case 1: buf0[1] = (buf0[1] & ml) | (tib40[1] & mr); break;
2419 case 2: buf0[2] = (buf0[2] & ml) | (tib40[2] & mr); break;
2420 case 3: buf0[3] = (buf0[3] & ml) | (tib40[3] & mr); break;
2421 case 4: buf1[0] = (buf1[0] & ml) | (tib41[0] & mr); break;
2422 case 5: buf1[1] = (buf1[1] & ml) | (tib41[1] & mr); break;
2423 case 6: buf1[2] = (buf1[2] & ml) | (tib41[2] & mr); break;
2424 case 7: buf1[3] = (buf1[3] & ml) | (tib41[3] & mr); break;
2425 }
2426
2427 return in_len;
2428 }
2429
2430 static u32 rule_op_mangle_replace_nm1 (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2431 {
2432 if (p0 == 0) return (in_len);
2433
2434 if (p0 >= in_len) return (in_len);
2435
2436 u32 tib40[4];
2437 u32 tib41[4];
2438
2439 rshift_block (buf0, buf1, tib40, tib41);
2440
2441 const u32 mr = 0xffu << ((p0 & 3) * 8);
2442 const u32 ml = ~mr;
2443
2444 switch (p0 / 4)
2445 {
2446 case 0: buf0[0] = (buf0[0] & ml) | (tib40[0] & mr); break;
2447 case 1: buf0[1] = (buf0[1] & ml) | (tib40[1] & mr); break;
2448 case 2: buf0[2] = (buf0[2] & ml) | (tib40[2] & mr); break;
2449 case 3: buf0[3] = (buf0[3] & ml) | (tib40[3] & mr); break;
2450 case 4: buf1[0] = (buf1[0] & ml) | (tib41[0] & mr); break;
2451 case 5: buf1[1] = (buf1[1] & ml) | (tib41[1] & mr); break;
2452 case 6: buf1[2] = (buf1[2] & ml) | (tib41[2] & mr); break;
2453 case 7: buf1[3] = (buf1[3] & ml) | (tib41[3] & mr); break;
2454 }
2455
2456 return in_len;
2457 }
2458
2459 static u32 rule_op_mangle_dupeblock_first (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2460 {
2461 if (p0 > in_len) return (in_len);
2462
2463 if ((in_len + p0) >= 32) return (in_len);
2464
2465 u32 out_len = in_len;
2466
2467 u32 tib40[4];
2468 u32 tib41[4];
2469
2470 tib40[0] = buf0[0];
2471 tib40[1] = buf0[1];
2472 tib40[2] = buf0[2];
2473 tib40[3] = buf0[3];
2474 tib41[0] = buf1[0];
2475 tib41[1] = buf1[1];
2476 tib41[2] = buf1[2];
2477 tib41[3] = buf1[3];
2478
2479 truncate_right (tib40, tib41, p0);
2480
2481 rshift_block_N (buf0, buf1, buf0, buf1, p0);
2482
2483 buf0[0] |= tib40[0];
2484 buf0[1] |= tib40[1];
2485 buf0[2] |= tib40[2];
2486 buf0[3] |= tib40[3];
2487 buf1[0] |= tib41[0];
2488 buf1[1] |= tib41[1];
2489 buf1[2] |= tib41[2];
2490 buf1[3] |= tib41[3];
2491
2492 out_len += p0;
2493
2494 return out_len;
2495 }
2496
2497 static u32 rule_op_mangle_dupeblock_last (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2498 {
2499 if (p0 > in_len) return (in_len);
2500
2501 if ((in_len + p0) >= 32) return (in_len);
2502
2503 u32 out_len = in_len;
2504
2505 u32 tib40[4];
2506 u32 tib41[4];
2507
2508 rshift_block_N (buf0, buf1, tib40, tib41, p0);
2509
2510 truncate_left (tib40, tib41, out_len);
2511
2512 buf0[0] |= tib40[0];
2513 buf0[1] |= tib40[1];
2514 buf0[2] |= tib40[2];
2515 buf0[3] |= tib40[3];
2516 buf1[0] |= tib41[0];
2517 buf1[1] |= tib41[1];
2518 buf1[2] |= tib41[2];
2519 buf1[3] |= tib41[3];
2520
2521 out_len += p0;
2522
2523 return out_len;
2524 }
2525
2526 static u32 rule_op_mangle_title (const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2527 {
2528 buf0[0] |= (generate_cmask (buf0[0]));
2529 buf0[1] |= (generate_cmask (buf0[1]));
2530 buf0[2] |= (generate_cmask (buf0[2]));
2531 buf0[3] |= (generate_cmask (buf0[3]));
2532 buf1[0] |= (generate_cmask (buf1[0]));
2533 buf1[1] |= (generate_cmask (buf1[1]));
2534 buf1[2] |= (generate_cmask (buf1[2]));
2535 buf1[3] |= (generate_cmask (buf1[3]));
2536
2537 buf0[0] &= ~(0x00000020 & generate_cmask (buf0[0]));
2538
2539 for (u32 i = 0; i < in_len; i++)
2540 {
2541 u32 tmp0 = 0;
2542 u32 tmp1 = 0;
2543
2544 switch (i)
2545 {
2546 case 0: tmp0 = (buf0[0] >> 0) & 0xFF;
2547 tmp1 = ~(0x00002000 & generate_cmask (buf0[0])); break;
2548 case 1: tmp0 = (buf0[0] >> 8) & 0xFF;
2549 tmp1 = ~(0x00200000 & generate_cmask (buf0[0])); break;
2550 case 2: tmp0 = (buf0[0] >> 16) & 0xFF;
2551 tmp1 = ~(0x20000000 & generate_cmask (buf0[0])); break;
2552 case 3: tmp0 = (buf0[0] >> 24) & 0xFF;
2553 tmp1 = ~(0x00000020 & generate_cmask (buf0[1])); break;
2554 case 4: tmp0 = (buf0[1] >> 0) & 0xFF;
2555 tmp1 = ~(0x00002000 & generate_cmask (buf0[1])); break;
2556 case 5: tmp0 = (buf0[1] >> 8) & 0xFF;
2557 tmp1 = ~(0x00200000 & generate_cmask (buf0[1])); break;
2558 case 6: tmp0 = (buf0[1] >> 16) & 0xFF;
2559 tmp1 = ~(0x20000000 & generate_cmask (buf0[1])); break;
2560 case 7: tmp0 = (buf0[1] >> 24) & 0xFF;
2561 tmp1 = ~(0x00000020 & generate_cmask (buf0[2])); break;
2562 case 8: tmp0 = (buf0[2] >> 0) & 0xFF;
2563 tmp1 = ~(0x00002000 & generate_cmask (buf0[2])); break;
2564 case 9: tmp0 = (buf0[2] >> 8) & 0xFF;
2565 tmp1 = ~(0x00200000 & generate_cmask (buf0[2])); break;
2566 case 10: tmp0 = (buf0[2] >> 16) & 0xFF;
2567 tmp1 = ~(0x20000000 & generate_cmask (buf0[2])); break;
2568 case 11: tmp0 = (buf0[2] >> 24) & 0xFF;
2569 tmp1 = ~(0x00000020 & generate_cmask (buf0[3])); break;
2570 case 12: tmp0 = (buf0[3] >> 0) & 0xFF;
2571 tmp1 = ~(0x00002000 & generate_cmask (buf0[3])); break;
2572 case 13: tmp0 = (buf0[3] >> 8) & 0xFF;
2573 tmp1 = ~(0x00200000 & generate_cmask (buf0[3])); break;
2574 case 14: tmp0 = (buf0[3] >> 16) & 0xFF;
2575 tmp1 = ~(0x20000000 & generate_cmask (buf0[3])); break;
2576 case 15: tmp0 = (buf0[3] >> 24) & 0xFF;
2577 tmp1 = ~(0x00000020 & generate_cmask (buf1[0])); break;
2578 case 16: tmp0 = (buf1[0] >> 0) & 0xFF;
2579 tmp1 = ~(0x00002000 & generate_cmask (buf1[0])); break;
2580 case 17: tmp0 = (buf1[0] >> 8) & 0xFF;
2581 tmp1 = ~(0x00200000 & generate_cmask (buf1[0])); break;
2582 case 18: tmp0 = (buf1[0] >> 16) & 0xFF;
2583 tmp1 = ~(0x20000000 & generate_cmask (buf1[0])); break;
2584 case 19: tmp0 = (buf1[0] >> 24) & 0xFF;
2585 tmp1 = ~(0x00000020 & generate_cmask (buf1[1])); break;
2586 case 20: tmp0 = (buf1[1] >> 0) & 0xFF;
2587 tmp1 = ~(0x00002000 & generate_cmask (buf1[1])); break;
2588 case 21: tmp0 = (buf1[1] >> 8) & 0xFF;
2589 tmp1 = ~(0x00200000 & generate_cmask (buf1[1])); break;
2590 case 22: tmp0 = (buf1[1] >> 16) & 0xFF;
2591 tmp1 = ~(0x20000000 & generate_cmask (buf1[1])); break;
2592 case 23: tmp0 = (buf1[1] >> 24) & 0xFF;
2593 tmp1 = ~(0x00000020 & generate_cmask (buf1[2])); break;
2594 case 24: tmp0 = (buf1[2] >> 0) & 0xFF;
2595 tmp1 = ~(0x00002000 & generate_cmask (buf1[2])); break;
2596 case 25: tmp0 = (buf1[2] >> 8) & 0xFF;
2597 tmp1 = ~(0x00200000 & generate_cmask (buf1[2])); break;
2598 case 26: tmp0 = (buf1[2] >> 16) & 0xFF;
2599 tmp1 = ~(0x20000000 & generate_cmask (buf1[2])); break;
2600 case 27: tmp0 = (buf1[2] >> 24) & 0xFF;
2601 tmp1 = ~(0x00000020 & generate_cmask (buf1[3])); break;
2602 case 28: tmp0 = (buf1[3] >> 0) & 0xFF;
2603 tmp1 = ~(0x00002000 & generate_cmask (buf1[3])); break;
2604 case 29: tmp0 = (buf1[3] >> 8) & 0xFF;
2605 tmp1 = ~(0x00200000 & generate_cmask (buf1[3])); break;
2606 case 30: tmp0 = (buf1[3] >> 16) & 0xFF;
2607 tmp1 = ~(0x20000000 & generate_cmask (buf1[3])); break;
2608 }
2609
2610 if (i < 3)
2611 {
2612 if (tmp0 == ' ') buf0[0] &= tmp1 ;
2613 }
2614 else if (i < 7)
2615 {
2616 if (tmp0 == ' ') buf0[1] &= tmp1 ;
2617 }
2618 else if (i < 11)
2619 {
2620 if (tmp0 == ' ') buf0[2] &= tmp1 ;
2621 }
2622 else if (i < 15)
2623 {
2624 if (tmp0 == ' ') buf0[3] &= tmp1 ;
2625 }
2626 else if (i < 19)
2627 {
2628 if (tmp0 == ' ') buf1[0] &= tmp1 ;
2629 }
2630 else if (i < 23)
2631 {
2632 if (tmp0 == ' ') buf1[1] &= tmp1 ;
2633 }
2634 else if (i < 27)
2635 {
2636 if (tmp0 == ' ') buf1[2] &= tmp1 ;
2637 }
2638 else if (i < 31)
2639 {
2640 if (tmp0 == ' ') buf1[3] &= tmp1 ;
2641 }
2642 }
2643
2644 return in_len;
2645 }
2646
2647 u32 apply_rule (const u32 name, const u32 p0, const u32 p1, u32 buf0[4], u32 buf1[4], const u32 in_len)
2648 {
2649 u32 out_len = in_len;
2650
2651 switch (name)
2652 {
2653 case RULE_OP_MANGLE_LREST: out_len = rule_op_mangle_lrest (p0, p1, buf0, buf1, out_len); break;
2654 case RULE_OP_MANGLE_UREST: out_len = rule_op_mangle_urest (p0, p1, buf0, buf1, out_len); break;
2655 case RULE_OP_MANGLE_LREST_UFIRST: out_len = rule_op_mangle_lrest_ufirst (p0, p1, buf0, buf1, out_len); break;
2656 case RULE_OP_MANGLE_UREST_LFIRST: out_len = rule_op_mangle_urest_lfirst (p0, p1, buf0, buf1, out_len); break;
2657 case RULE_OP_MANGLE_TREST: out_len = rule_op_mangle_trest (p0, p1, buf0, buf1, out_len); break;
2658 case RULE_OP_MANGLE_TOGGLE_AT: out_len = rule_op_mangle_toggle_at (p0, p1, buf0, buf1, out_len); break;
2659 case RULE_OP_MANGLE_REVERSE: out_len = rule_op_mangle_reverse (p0, p1, buf0, buf1, out_len); break;
2660 case RULE_OP_MANGLE_DUPEWORD: out_len = rule_op_mangle_dupeword (p0, p1, buf0, buf1, out_len); break;
2661 case RULE_OP_MANGLE_DUPEWORD_TIMES: out_len = rule_op_mangle_dupeword_times (p0, p1, buf0, buf1, out_len); break;
2662 case RULE_OP_MANGLE_REFLECT: out_len = rule_op_mangle_reflect (p0, p1, buf0, buf1, out_len); break;
2663 case RULE_OP_MANGLE_APPEND: out_len = rule_op_mangle_append (p0, p1, buf0, buf1, out_len); break;
2664 case RULE_OP_MANGLE_PREPEND: out_len = rule_op_mangle_prepend (p0, p1, buf0, buf1, out_len); break;
2665 case RULE_OP_MANGLE_ROTATE_LEFT: out_len = rule_op_mangle_rotate_left (p0, p1, buf0, buf1, out_len); break;
2666 case RULE_OP_MANGLE_ROTATE_RIGHT: out_len = rule_op_mangle_rotate_right (p0, p1, buf0, buf1, out_len); break;
2667 case RULE_OP_MANGLE_DELETE_FIRST: out_len = rule_op_mangle_delete_first (p0, p1, buf0, buf1, out_len); break;
2668 case RULE_OP_MANGLE_DELETE_LAST: out_len = rule_op_mangle_delete_last (p0, p1, buf0, buf1, out_len); break;
2669 case RULE_OP_MANGLE_DELETE_AT: out_len = rule_op_mangle_delete_at (p0, p1, buf0, buf1, out_len); break;
2670 case RULE_OP_MANGLE_EXTRACT: out_len = rule_op_mangle_extract (p0, p1, buf0, buf1, out_len); break;
2671 case RULE_OP_MANGLE_OMIT: out_len = rule_op_mangle_omit (p0, p1, buf0, buf1, out_len); break;
2672 case RULE_OP_MANGLE_INSERT: out_len = rule_op_mangle_insert (p0, p1, buf0, buf1, out_len); break;
2673 case RULE_OP_MANGLE_OVERSTRIKE: out_len = rule_op_mangle_overstrike (p0, p1, buf0, buf1, out_len); break;
2674 case RULE_OP_MANGLE_TRUNCATE_AT: out_len = rule_op_mangle_truncate_at (p0, p1, buf0, buf1, out_len); break;
2675 case RULE_OP_MANGLE_REPLACE: out_len = rule_op_mangle_replace (p0, p1, buf0, buf1, out_len); break;
2676 case RULE_OP_MANGLE_PURGECHAR: out_len = rule_op_mangle_purgechar (p0, p1, buf0, buf1, out_len); break;
2677 //case RULE_OP_MANGLE_TOGGLECASE_REC: out_len = rule_op_mangle_togglecase_rec (p0, p1, buf0, buf1, out_len); break;
2678 case RULE_OP_MANGLE_DUPECHAR_FIRST: out_len = rule_op_mangle_dupechar_first (p0, p1, buf0, buf1, out_len); break;
2679 case RULE_OP_MANGLE_DUPECHAR_LAST: out_len = rule_op_mangle_dupechar_last (p0, p1, buf0, buf1, out_len); break;
2680 case RULE_OP_MANGLE_DUPECHAR_ALL: out_len = rule_op_mangle_dupechar_all (p0, p1, buf0, buf1, out_len); break;
2681 case RULE_OP_MANGLE_SWITCH_FIRST: out_len = rule_op_mangle_switch_first (p0, p1, buf0, buf1, out_len); break;
2682 case RULE_OP_MANGLE_SWITCH_LAST: out_len = rule_op_mangle_switch_last (p0, p1, buf0, buf1, out_len); break;
2683 case RULE_OP_MANGLE_SWITCH_AT: out_len = rule_op_mangle_switch_at (p0, p1, buf0, buf1, out_len); break;
2684 case RULE_OP_MANGLE_CHR_SHIFTL: out_len = rule_op_mangle_chr_shiftl (p0, p1, buf0, buf1, out_len); break;
2685 case RULE_OP_MANGLE_CHR_SHIFTR: out_len = rule_op_mangle_chr_shiftr (p0, p1, buf0, buf1, out_len); break;
2686 case RULE_OP_MANGLE_CHR_INCR: out_len = rule_op_mangle_chr_incr (p0, p1, buf0, buf1, out_len); break;
2687 case RULE_OP_MANGLE_CHR_DECR: out_len = rule_op_mangle_chr_decr (p0, p1, buf0, buf1, out_len); break;
2688 case RULE_OP_MANGLE_REPLACE_NP1: out_len = rule_op_mangle_replace_np1 (p0, p1, buf0, buf1, out_len); break;
2689 case RULE_OP_MANGLE_REPLACE_NM1: out_len = rule_op_mangle_replace_nm1 (p0, p1, buf0, buf1, out_len); break;
2690 case RULE_OP_MANGLE_DUPEBLOCK_FIRST: out_len = rule_op_mangle_dupeblock_first (p0, p1, buf0, buf1, out_len); break;
2691 case RULE_OP_MANGLE_DUPEBLOCK_LAST: out_len = rule_op_mangle_dupeblock_last (p0, p1, buf0, buf1, out_len); break;
2692 case RULE_OP_MANGLE_TITLE: out_len = rule_op_mangle_title (p0, p1, buf0, buf1, out_len); break;
2693 }
2694
2695 return out_len;
2696 }
2697
2698 u32 apply_rules (u32 *cmds, u32 buf0[4], u32 buf1[4], const u32 len)
2699 {
2700 u32 out_len = len;
2701
2702 for (u32 i = 0; cmds[i] != 0; i++)
2703 {
2704 const u32 cmd = cmds[i];
2705
2706 const u32 name = (cmd >> 0) & 0xff;
2707 const u32 p0 = (cmd >> 8) & 0xff;
2708 const u32 p1 = (cmd >> 16) & 0xff;
2709
2710 out_len = apply_rule (name, p0, p1, buf0, buf1, out_len);
2711 }
2712
2713 return out_len;
2714 }