Initial commit
[hashcat.git] / src / rp_gpu_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-variable"
8 #pragma GCC diagnostic ignored "-Wunused-but-set-variable"
9 #pragma GCC diagnostic ignored "-Wunused-function"
10
11 #include <rp_gpu_on_cpu.h>
12
13 static uint32_t generate_cmask (uint32_t buf)
14 {
15 const uint32_t rmask = ((buf & 0x40404040) >> 1)
16 & ~((buf & 0x80808080) >> 2);
17
18 const uint32_t hmask = (buf & 0x1f1f1f1f) + 0x05050505;
19 const uint32_t lmask = (buf & 0x1f1f1f1f) + 0x1f1f1f1f;
20
21 return rmask & ~hmask & lmask;
22 }
23
24 static void truncate_right (uint32_t w0[4], uint32_t w1[4], const uint len)
25 {
26 const uint tmp = (1 << ((len % 4) * 8)) - 1;
27
28 switch (len / 4)
29 {
30 case 0: w0[0] &= tmp;
31 w0[1] = 0;
32 w0[2] = 0;
33 w0[3] = 0;
34 w1[0] = 0;
35 w1[1] = 0;
36 w1[2] = 0;
37 w1[3] = 0;
38 break;
39 case 1: w0[1] &= tmp;
40 w0[2] = 0;
41 w0[3] = 0;
42 w1[0] = 0;
43 w1[1] = 0;
44 w1[2] = 0;
45 w1[3] = 0;
46 break;
47 case 2: w0[2] &= tmp;
48 w0[3] = 0;
49 w1[0] = 0;
50 w1[1] = 0;
51 w1[2] = 0;
52 w1[3] = 0;
53 break;
54 case 3: w0[3] &= tmp;
55 w1[0] = 0;
56 w1[1] = 0;
57 w1[2] = 0;
58 w1[3] = 0;
59 break;
60 case 4: w1[0] &= tmp;
61 w1[1] = 0;
62 w1[2] = 0;
63 w1[3] = 0;
64 break;
65 case 5: w1[1] &= tmp;
66 w1[2] = 0;
67 w1[3] = 0;
68 break;
69 case 6: w1[2] &= tmp;
70 w1[3] = 0;
71 break;
72 case 7: w1[3] &= tmp;
73 break;
74 }
75 }
76
77 static void truncate_left (uint32_t w0[4], uint32_t w1[4], const uint len)
78 {
79 const uint tmp = ~((1 << ((len % 4) * 8)) - 1);
80
81 switch (len / 4)
82 {
83 case 0: w0[0] &= tmp;
84 break;
85 case 1: w0[0] = 0;
86 w0[1] &= tmp;
87 break;
88 case 2: w0[0] = 0;
89 w0[1] = 0;
90 w0[2] &= tmp;
91 break;
92 case 3: w0[0] = 0;
93 w0[1] = 0;
94 w0[2] = 0;
95 w0[3] &= tmp;
96 break;
97 case 4: w0[0] = 0;
98 w0[1] = 0;
99 w0[2] = 0;
100 w0[3] = 0;
101 w1[0] &= tmp;
102 break;
103 case 5: w0[0] = 0;
104 w0[1] = 0;
105 w0[2] = 0;
106 w0[3] = 0;
107 w1[0] = 0;
108 w1[1] &= tmp;
109 break;
110 case 6: w0[0] = 0;
111 w0[1] = 0;
112 w0[2] = 0;
113 w0[3] = 0;
114 w1[0] = 0;
115 w1[1] = 0;
116 w1[2] &= tmp;
117 break;
118 case 7: w0[0] = 0;
119 w0[1] = 0;
120 w0[2] = 0;
121 w0[3] = 0;
122 w1[0] = 0;
123 w1[1] = 0;
124 w1[2] = 0;
125 w1[3] &= tmp;
126 break;
127 }
128 }
129
130 static void lshift_block (const uint32_t in0[4], const uint32_t in1[4], uint32_t out0[4], uint32_t out1[4])
131 {
132 out0[0] = in0[0] >> 8 | in0[1] << 24;
133 out0[1] = in0[1] >> 8 | in0[2] << 24;
134 out0[2] = in0[2] >> 8 | in0[3] << 24;
135 out0[3] = in0[3] >> 8 | in1[0] << 24;
136 out1[0] = in1[0] >> 8 | in1[1] << 24;
137 out1[1] = in1[1] >> 8 | in1[2] << 24;
138 out1[2] = in1[2] >> 8 | in1[3] << 24;
139 out1[3] = in1[3] >> 8;
140 }
141
142 static void rshift_block (const uint32_t in0[4], const uint32_t in1[4], uint32_t out0[4], uint32_t out1[4])
143 {
144 out1[3] = in1[3] << 8 | in1[2] >> 24;
145 out1[2] = in1[2] << 8 | in1[1] >> 24;
146 out1[1] = in1[1] << 8 | in1[0] >> 24;
147 out1[0] = in1[0] << 8 | in0[3] >> 24;
148 out0[3] = in0[3] << 8 | in0[2] >> 24;
149 out0[2] = in0[2] << 8 | in0[1] >> 24;
150 out0[1] = in0[1] << 8 | in0[0] >> 24;
151 out0[0] = in0[0] << 8;
152 }
153
154 static void rshift_block_N (const uint32_t in0[4], const uint32_t in1[4], uint32_t out0[4], uint32_t out1[4], const uint num)
155 {
156 switch (num)
157 {
158 case 0: out1[3] = in1[3];
159 out1[2] = in1[2];
160 out1[1] = in1[1];
161 out1[0] = in1[0];
162 out0[3] = in0[3];
163 out0[2] = in0[2];
164 out0[1] = in0[1];
165 out0[0] = in0[0];
166 break;
167 case 1: out1[3] = in1[3] << 8 | in1[2] >> 24;
168 out1[2] = in1[2] << 8 | in1[1] >> 24;
169 out1[1] = in1[1] << 8 | in1[0] >> 24;
170 out1[0] = in1[0] << 8 | in0[3] >> 24;
171 out0[3] = in0[3] << 8 | in0[2] >> 24;
172 out0[2] = in0[2] << 8 | in0[1] >> 24;
173 out0[1] = in0[1] << 8 | in0[0] >> 24;
174 out0[0] = in0[0] << 8;
175 break;
176 case 2: out1[3] = in1[3] << 16 | in1[2] >> 16;
177 out1[2] = in1[2] << 16 | in1[1] >> 16;
178 out1[1] = in1[1] << 16 | in1[0] >> 16;
179 out1[0] = in1[0] << 16 | in0[3] >> 16;
180 out0[3] = in0[3] << 16 | in0[2] >> 16;
181 out0[2] = in0[2] << 16 | in0[1] >> 16;
182 out0[1] = in0[1] << 16 | in0[0] >> 16;
183 out0[0] = in0[0] << 16;
184 break;
185 case 3: out1[3] = in1[3] << 24 | in1[2] >> 8;
186 out1[2] = in1[2] << 24 | in1[1] >> 8;
187 out1[1] = in1[1] << 24 | in1[0] >> 8;
188 out1[0] = in1[0] << 24 | in0[3] >> 8;
189 out0[3] = in0[3] << 24 | in0[2] >> 8;
190 out0[2] = in0[2] << 24 | in0[1] >> 8;
191 out0[1] = in0[1] << 24 | in0[0] >> 8;
192 out0[0] = in0[0] << 24;
193 break;
194 case 4: out1[3] = in1[2];
195 out1[2] = in1[1];
196 out1[1] = in1[0];
197 out1[0] = in0[3];
198 out0[3] = in0[2];
199 out0[2] = in0[1];
200 out0[1] = in0[0];
201 out0[0] = 0;
202 break;
203 case 5: out1[3] = in1[2] << 8 | in1[1] >> 24;
204 out1[2] = in1[1] << 8 | in1[0] >> 24;
205 out1[1] = in1[0] << 8 | in0[3] >> 24;
206 out1[0] = in0[3] << 8 | in0[2] >> 24;
207 out0[3] = in0[2] << 8 | in0[1] >> 24;
208 out0[2] = in0[1] << 8 | in0[0] >> 24;
209 out0[1] = in0[0] << 8;
210 out0[0] = 0;
211 break;
212 case 6: out1[3] = in1[2] << 16 | in1[1] >> 16;
213 out1[2] = in1[1] << 16 | in1[0] >> 16;
214 out1[1] = in1[0] << 16 | in0[3] >> 16;
215 out1[0] = in0[3] << 16 | in0[2] >> 16;
216 out0[3] = in0[2] << 16 | in0[1] >> 16;
217 out0[2] = in0[1] << 16 | in0[0] >> 16;
218 out0[1] = in0[0] << 16;
219 out0[0] = 0;
220 break;
221 case 7: out1[3] = in1[2] << 24 | in1[1] >> 8;
222 out1[2] = in1[1] << 24 | in1[0] >> 8;
223 out1[1] = in1[0] << 24 | in0[3] >> 8;
224 out1[0] = in0[3] << 24 | in0[2] >> 8;
225 out0[3] = in0[2] << 24 | in0[1] >> 8;
226 out0[2] = in0[1] << 24 | in0[0] >> 8;
227 out0[1] = in0[0] << 24;
228 out0[0] = 0;
229 break;
230 case 8: out1[3] = in1[1];
231 out1[2] = in1[0];
232 out1[1] = in0[3];
233 out1[0] = in0[2];
234 out0[3] = in0[1];
235 out0[2] = in0[0];
236 out0[1] = 0;
237 out0[0] = 0;
238 break;
239 case 9: out1[3] = in1[1] << 8 | in1[0] >> 24;
240 out1[2] = in1[0] << 8 | in0[3] >> 24;
241 out1[1] = in0[3] << 8 | in0[2] >> 24;
242 out1[0] = in0[2] << 8 | in0[1] >> 24;
243 out0[3] = in0[1] << 8 | in0[0] >> 24;
244 out0[2] = in0[0] << 8;
245 out0[1] = 0;
246 out0[0] = 0;
247 break;
248 case 10: out1[3] = in1[1] << 16 | in1[0] >> 16;
249 out1[2] = in1[0] << 16 | in0[3] >> 16;
250 out1[1] = in0[3] << 16 | in0[2] >> 16;
251 out1[0] = in0[2] << 16 | in0[1] >> 16;
252 out0[3] = in0[1] << 16 | in0[0] >> 16;
253 out0[2] = in0[0] << 16;
254 out0[1] = 0;
255 out0[0] = 0;
256 break;
257 case 11: out1[3] = in1[1] << 24 | in1[0] >> 8;
258 out1[2] = in1[0] << 24 | in0[3] >> 8;
259 out1[1] = in0[3] << 24 | in0[2] >> 8;
260 out1[0] = in0[2] << 24 | in0[1] >> 8;
261 out0[3] = in0[1] << 24 | in0[0] >> 8;
262 out0[2] = in0[0] << 24;
263 out0[1] = 0;
264 out0[0] = 0;
265 break;
266 case 12: out1[3] = in1[0];
267 out1[2] = in0[3];
268 out1[1] = in0[2];
269 out1[0] = in0[1];
270 out0[3] = in0[0];
271 out0[2] = 0;
272 out0[1] = 0;
273 out0[0] = 0;
274 break;
275 case 13: out1[3] = in1[0] << 8 | in0[3] >> 24;
276 out1[2] = in0[3] << 8 | in0[2] >> 24;
277 out1[1] = in0[2] << 8 | in0[1] >> 24;
278 out1[0] = in0[1] << 8 | in0[0] >> 24;
279 out0[3] = in0[0] << 8;
280 out0[2] = 0;
281 out0[1] = 0;
282 out0[0] = 0;
283 break;
284 case 14: out1[3] = in1[0] << 16 | in0[3] >> 16;
285 out1[2] = in0[3] << 16 | in0[2] >> 16;
286 out1[1] = in0[2] << 16 | in0[1] >> 16;
287 out1[0] = in0[1] << 16 | in0[0] >> 16;
288 out0[3] = in0[0] << 16;
289 out0[2] = 0;
290 out0[1] = 0;
291 out0[0] = 0;
292 break;
293 case 15: out1[3] = in1[0] << 24 | in0[3] >> 8;
294 out1[2] = in0[3] << 24 | in0[2] >> 8;
295 out1[1] = in0[2] << 24 | in0[1] >> 8;
296 out1[0] = in0[1] << 24 | in0[0] >> 8;
297 out0[3] = in0[0] << 24;
298 out0[2] = 0;
299 out0[1] = 0;
300 out0[0] = 0;
301 break;
302 case 16: out1[3] = in0[3];
303 out1[2] = in0[2];
304 out1[1] = in0[1];
305 out1[0] = in0[0];
306 out0[3] = 0;
307 out0[2] = 0;
308 out0[1] = 0;
309 out0[0] = 0;
310 break;
311 case 17: out1[3] = in0[3] << 8 | in0[2] >> 24;
312 out1[2] = in0[2] << 8 | in0[1] >> 24;
313 out1[1] = in0[1] << 8 | in0[0] >> 24;
314 out1[0] = in0[0] << 8;
315 out0[3] = 0;
316 out0[2] = 0;
317 out0[1] = 0;
318 out0[0] = 0;
319 break;
320 case 18: out1[3] = in0[3] << 16 | in0[2] >> 16;
321 out1[2] = in0[2] << 16 | in0[1] >> 16;
322 out1[1] = in0[1] << 16 | in0[0] >> 16;
323 out1[0] = in0[0] << 16;
324 out0[3] = 0;
325 out0[2] = 0;
326 out0[1] = 0;
327 out0[0] = 0;
328 break;
329 case 19: out1[3] = in0[3] << 24 | in0[2] >> 8;
330 out1[2] = in0[2] << 24 | in0[1] >> 8;
331 out1[1] = in0[1] << 24 | in0[0] >> 8;
332 out1[0] = in0[0] << 24;
333 out0[3] = 0;
334 out0[2] = 0;
335 out0[1] = 0;
336 out0[0] = 0;
337 break;
338 case 20: out1[3] = in0[2];
339 out1[2] = in0[1];
340 out1[1] = in0[0];
341 out1[0] = 0;
342 out0[3] = 0;
343 out0[2] = 0;
344 out0[1] = 0;
345 out0[0] = 0;
346 break;
347 case 21: out1[3] = in0[2] << 8 | in0[1] >> 24;
348 out1[2] = in0[1] << 8 | in0[0] >> 24;
349 out1[1] = in0[0] << 8;
350 out1[0] = 0;
351 out0[3] = 0;
352 out0[2] = 0;
353 out0[1] = 0;
354 out0[0] = 0;
355 break;
356 case 22: out1[3] = in0[2] << 16 | in0[1] >> 16;
357 out1[2] = in0[1] << 16 | in0[0] >> 16;
358 out1[1] = in0[0] << 16;
359 out1[0] = 0;
360 out0[3] = 0;
361 out0[2] = 0;
362 out0[1] = 0;
363 out0[0] = 0;
364 break;
365 case 23: out1[3] = in0[2] << 24 | in0[1] >> 8;
366 out1[2] = in0[1] << 24 | in0[0] >> 8;
367 out1[1] = in0[0] << 24;
368 out1[0] = 0;
369 out0[3] = 0;
370 out0[2] = 0;
371 out0[1] = 0;
372 out0[0] = 0;
373 break;
374 case 24: out1[3] = in0[1];
375 out1[2] = in0[0];
376 out1[1] = 0;
377 out1[0] = 0;
378 out0[3] = 0;
379 out0[2] = 0;
380 out0[1] = 0;
381 out0[0] = 0;
382 break;
383 case 25: out1[3] = in0[1] << 8 | in0[0] >> 24;
384 out1[2] = in0[0] << 8;
385 out1[1] = 0;
386 out1[0] = 0;
387 out0[3] = 0;
388 out0[2] = 0;
389 out0[1] = 0;
390 out0[0] = 0;
391 break;
392 case 26: out1[3] = in0[1] << 16 | in0[0] >> 16;
393 out1[2] = in0[0] << 16;
394 out1[1] = 0;
395 out1[0] = 0;
396 out0[3] = 0;
397 out0[2] = 0;
398 out0[1] = 0;
399 out0[0] = 0;
400 break;
401 case 27: out1[3] = in0[1] << 24 | in0[0] >> 8;
402 out1[2] = in0[0] << 24;
403 out1[1] = 0;
404 out1[0] = 0;
405 out0[3] = 0;
406 out0[2] = 0;
407 out0[1] = 0;
408 out0[0] = 0;
409 break;
410 case 28: out1[3] = in0[0];
411 out1[2] = 0;
412 out1[1] = 0;
413 out1[0] = 0;
414 out0[3] = 0;
415 out0[2] = 0;
416 out0[1] = 0;
417 out0[0] = 0;
418 break;
419 case 29: out1[3] = in0[0] << 8;
420 out1[2] = 0;
421 out1[1] = 0;
422 out1[0] = 0;
423 out0[3] = 0;
424 out0[2] = 0;
425 out0[1] = 0;
426 out0[0] = 0;
427 break;
428 case 30: out1[3] = in0[0] << 16;
429 out1[2] = 0;
430 out1[1] = 0;
431 out1[0] = 0;
432 out0[3] = 0;
433 out0[2] = 0;
434 out0[1] = 0;
435 out0[0] = 0;
436 break;
437 case 31: out1[3] = in0[0] << 24;
438 out1[2] = 0;
439 out1[1] = 0;
440 out1[0] = 0;
441 out0[3] = 0;
442 out0[2] = 0;
443 out0[1] = 0;
444 out0[0] = 0;
445 break;
446 }
447 }
448
449 static void lshift_block_N (const uint32_t in0[4], const uint32_t in1[4], uint32_t out0[4], uint32_t out1[4], const uint num)
450 {
451 switch (num)
452 {
453 case 0: out0[0] = in0[0];
454 out0[1] = in0[1];
455 out0[2] = in0[2];
456 out0[3] = in0[3];
457 out1[0] = in1[0];
458 out1[1] = in1[1];
459 out1[2] = in1[2];
460 out1[3] = in1[3];
461 break;
462 case 1: out0[0] = in0[0] >> 8 | in0[1] << 24;
463 out0[1] = in0[1] >> 8 | in0[2] << 24;
464 out0[2] = in0[2] >> 8 | in0[3] << 24;
465 out0[3] = in0[3] >> 8 | in1[0] << 24;
466 out1[0] = in1[0] >> 8 | in1[1] << 24;
467 out1[1] = in1[1] >> 8 | in1[2] << 24;
468 out1[2] = in1[2] >> 8 | in1[3] << 24;
469 out1[3] = in1[3] >> 8;
470 break;
471 case 2: out0[0] = in0[0] >> 16 | in0[1] << 16;
472 out0[1] = in0[1] >> 16 | in0[2] << 16;
473 out0[2] = in0[2] >> 16 | in0[3] << 16;
474 out0[3] = in0[3] >> 16 | in1[0] << 16;
475 out1[0] = in1[0] >> 16 | in1[1] << 16;
476 out1[1] = in1[1] >> 16 | in1[2] << 16;
477 out1[2] = in1[2] >> 16 | in1[3] << 16;
478 out1[3] = in1[3] >> 16;
479 break;
480 case 3: out0[0] = in0[0] >> 24 | in0[1] << 8;
481 out0[1] = in0[1] >> 24 | in0[2] << 8;
482 out0[2] = in0[2] >> 24 | in0[3] << 8;
483 out0[3] = in0[3] >> 24 | in1[0] << 8;
484 out1[0] = in1[0] >> 24 | in1[1] << 8;
485 out1[1] = in1[1] >> 24 | in1[2] << 8;
486 out1[2] = in1[2] >> 24 | in1[3] << 8;
487 out1[3] = in1[3] >> 24;
488 break;
489 case 4: out0[0] = in0[1];
490 out0[1] = in0[2];
491 out0[2] = in0[3];
492 out0[3] = in1[0];
493 out1[0] = in1[1];
494 out1[1] = in1[2];
495 out1[2] = in1[3];
496 out1[3] = 0;
497 break;
498 case 5: out0[0] = in0[1] >> 8 | in0[2] << 24;
499 out0[1] = in0[2] >> 8 | in0[3] << 24;
500 out0[2] = in0[3] >> 8 | in1[0] << 24;
501 out0[3] = in1[0] >> 8 | in1[1] << 24;
502 out1[0] = in1[1] >> 8 | in1[2] << 24;
503 out1[1] = in1[2] >> 8 | in1[3] << 24;
504 out1[2] = in1[3] >> 8;
505 out1[3] = 0;
506 break;
507 case 6: out0[0] = in0[1] >> 16 | in0[2] << 16;
508 out0[1] = in0[2] >> 16 | in0[3] << 16;
509 out0[2] = in0[3] >> 16 | in1[0] << 16;
510 out0[3] = in1[0] >> 16 | in1[1] << 16;
511 out1[0] = in1[1] >> 16 | in1[2] << 16;
512 out1[1] = in1[2] >> 16 | in1[3] << 16;
513 out1[2] = in1[3] >> 16;
514 out1[3] = 0;
515 break;
516 case 7: out0[0] = in0[1] >> 24 | in0[2] << 8;
517 out0[1] = in0[2] >> 24 | in0[3] << 8;
518 out0[2] = in0[3] >> 24 | in1[0] << 8;
519 out0[3] = in1[0] >> 24 | in1[1] << 8;
520 out1[0] = in1[1] >> 24 | in1[2] << 8;
521 out1[1] = in1[2] >> 24 | in1[3] << 8;
522 out1[2] = in1[3] >> 24;
523 out1[3] = 0;
524 break;
525 case 8: out0[0] = in0[2];
526 out0[1] = in0[3];
527 out0[2] = in1[0];
528 out0[3] = in1[1];
529 out1[0] = in1[2];
530 out1[1] = in1[3];
531 out1[2] = 0;
532 out1[3] = 0;
533 break;
534 case 9: out0[0] = in0[2] >> 8 | in0[3] << 24;
535 out0[1] = in0[3] >> 8 | in1[0] << 24;
536 out0[2] = in1[0] >> 8 | in1[1] << 24;
537 out0[3] = in1[1] >> 8 | in1[2] << 24;
538 out1[0] = in1[2] >> 8 | in1[3] << 24;
539 out1[1] = in1[3] >> 8;
540 out1[2] = 0;
541 out1[3] = 0;
542 break;
543 case 10: out0[0] = in0[2] >> 16 | in0[3] << 16;
544 out0[1] = in0[3] >> 16 | in1[0] << 16;
545 out0[2] = in1[0] >> 16 | in1[1] << 16;
546 out0[3] = in1[1] >> 16 | in1[2] << 16;
547 out1[0] = in1[2] >> 16 | in1[3] << 16;
548 out1[1] = in1[3] >> 16;
549 out1[2] = 0;
550 out1[3] = 0;
551 break;
552 case 11: out0[0] = in0[2] >> 24 | in0[3] << 8;
553 out0[1] = in0[3] >> 24 | in1[0] << 8;
554 out0[2] = in1[0] >> 24 | in1[1] << 8;
555 out0[3] = in1[1] >> 24 | in1[2] << 8;
556 out1[0] = in1[2] >> 24 | in1[3] << 8;
557 out1[1] = in1[3] >> 24;
558 out1[2] = 0;
559 out1[3] = 0;
560 break;
561 case 12: out0[0] = in0[3];
562 out0[1] = in1[0];
563 out0[2] = in1[1];
564 out0[3] = in1[2];
565 out1[0] = in1[3];
566 out1[1] = 0;
567 out1[2] = 0;
568 out1[3] = 0;
569 break;
570 case 13:
571 out0[0] = in0[3] >> 8 | in1[0] << 24;
572 out0[1] = in1[0] >> 8 | in1[1] << 24;
573 out0[2] = in1[1] >> 8 | in1[2] << 24;
574 out0[3] = in1[2] >> 8 | in1[3] << 24;
575 out1[0] = in1[3] >> 8;
576 out1[1] = 0;
577 out1[2] = 0;
578 out1[3] = 0;
579 break;
580 case 14: out0[0] = in0[3] >> 16 | in1[0] << 16;
581 out0[1] = in1[0] >> 16 | in1[1] << 16;
582 out0[2] = in1[1] >> 16 | in1[2] << 16;
583 out0[3] = in1[2] >> 16 | in1[3] << 16;
584 out1[0] = in1[3] >> 16;
585 out1[1] = 0;
586 out1[2] = 0;
587 out1[3] = 0;
588 break;
589 case 15: out0[0] = in0[3] >> 24 | in1[0] << 8;
590 out0[1] = in1[0] >> 24 | in1[1] << 8;
591 out0[2] = in1[1] >> 24 | in1[2] << 8;
592 out0[3] = in1[2] >> 24 | in1[3] << 8;
593 out1[0] = in1[3] >> 24;
594 out1[1] = 0;
595 out1[2] = 0;
596 out1[3] = 0;
597 break;
598 case 16: out0[0] = in1[0];
599 out0[1] = in1[1];
600 out0[2] = in1[2];
601 out0[3] = in1[3];
602 out1[0] = 0;
603 out1[1] = 0;
604 out1[2] = 0;
605 out1[3] = 0;
606 break;
607 case 17: out0[0] = in1[0] >> 8 | in1[1] << 24;
608 out0[1] = in1[1] >> 8 | in1[2] << 24;
609 out0[2] = in1[2] >> 8 | in1[3] << 24;
610 out0[3] = in1[3] >> 8;
611 out1[0] = 0;
612 out1[1] = 0;
613 out1[2] = 0;
614 out1[3] = 0;
615 break;
616 case 18: out0[0] = in1[0] >> 16 | in1[1] << 16;
617 out0[1] = in1[1] >> 16 | in1[2] << 16;
618 out0[2] = in1[2] >> 16 | in1[3] << 16;
619 out0[3] = in1[3] >> 16;
620 out1[0] = 0;
621 out1[1] = 0;
622 out1[2] = 0;
623 out1[3] = 0;
624 break;
625 case 19: out0[0] = in1[0] >> 24 | in1[1] << 8;
626 out0[1] = in1[1] >> 24 | in1[2] << 8;
627 out0[2] = in1[2] >> 24 | in1[3] << 8;
628 out0[3] = in1[3] >> 24;
629 out1[0] = 0;
630 out1[1] = 0;
631 out1[2] = 0;
632 out1[3] = 0;
633 break;
634 case 20: out0[0] = in1[1];
635 out0[1] = in1[2];
636 out0[2] = in1[3];
637 out0[3] = 0;
638 out1[0] = 0;
639 out1[1] = 0;
640 out1[2] = 0;
641 out1[3] = 0;
642 break;
643 case 21: out0[0] = in1[1] >> 8 | in1[2] << 24;
644 out0[1] = in1[2] >> 8 | in1[3] << 24;
645 out0[2] = in1[3] >> 8;
646 out0[3] = 0;
647 out1[0] = 0;
648 out1[1] = 0;
649 out1[2] = 0;
650 out1[3] = 0;
651 break;
652 case 22: out0[0] = in1[1] >> 16 | in1[2] << 16;
653 out0[1] = in1[2] >> 16 | in1[3] << 16;
654 out0[2] = in1[3] >> 16;
655 out0[3] = 0;
656 out1[0] = 0;
657 out1[1] = 0;
658 out1[2] = 0;
659 out1[3] = 0;
660 break;
661 case 23: out0[0] = in1[1] >> 24 | in1[2] << 8;
662 out0[1] = in1[2] >> 24 | in1[3] << 8;
663 out0[2] = in1[3] >> 24;
664 out0[3] = 0;
665 out1[0] = 0;
666 out1[1] = 0;
667 out1[2] = 0;
668 out1[3] = 0;
669 break;
670 case 24: out0[0] = in1[2];
671 out0[1] = in1[3];
672 out0[2] = 0;
673 out0[3] = 0;
674 out1[0] = 0;
675 out1[1] = 0;
676 out1[2] = 0;
677 out1[3] = 0;
678 break;
679 case 25: out0[0] = in1[2] >> 8 | in1[3] << 24;
680 out0[1] = in1[3] >> 8;
681 out0[2] = 0;
682 out0[3] = 0;
683 out1[0] = 0;
684 out1[1] = 0;
685 out1[2] = 0;
686 out1[3] = 0;
687 break;
688 case 26: out0[0] = in1[2] >> 16 | in1[3] << 16;
689 out0[1] = in1[3] >> 16;
690 out0[2] = 0;
691 out0[3] = 0;
692 out1[0] = 0;
693 out1[1] = 0;
694 out1[2] = 0;
695 out1[3] = 0;
696 break;
697 case 27: out0[0] = in1[2] >> 24 | in1[3] << 8;
698 out0[1] = in1[3] >> 24;
699 out0[2] = 0;
700 out0[3] = 0;
701 out1[0] = 0;
702 out1[1] = 0;
703 out1[2] = 0;
704 out1[3] = 0;
705 break;
706 case 28: out0[0] = in1[3];
707 out0[1] = 0;
708 out0[2] = 0;
709 out0[3] = 0;
710 out1[0] = 0;
711 out1[1] = 0;
712 out1[2] = 0;
713 out1[3] = 0;
714 break;
715 case 29: out0[0] = in1[3] >> 8;
716 out0[1] = 0;
717 out0[2] = 0;
718 out0[3] = 0;
719 out1[0] = 0;
720 out1[1] = 0;
721 out1[2] = 0;
722 out1[3] = 0;
723 break;
724 case 30: out0[0] = in1[3] >> 16;
725 out0[1] = 0;
726 out0[2] = 0;
727 out0[3] = 0;
728 out1[0] = 0;
729 out1[1] = 0;
730 out1[2] = 0;
731 out1[3] = 0;
732 break;
733 case 31: out0[0] = in1[3] >> 24;
734 out0[1] = 0;
735 out0[2] = 0;
736 out0[3] = 0;
737 out1[0] = 0;
738 out1[1] = 0;
739 out1[2] = 0;
740 out1[3] = 0;
741 break;
742 }
743 }
744
745 static void append_block1 (const uint offset, uint32_t dst0[4], uint32_t dst1[4], const uint32_t src_r0)
746 {
747 uint32_t tmp[2];
748
749 switch (offset & 3)
750 {
751 case 0: tmp[0] = src_r0;
752 tmp[1] = 0;
753 break;
754 case 1: tmp[0] = src_r0 << 8;
755 tmp[1] = src_r0 >> 24;
756 break;
757 case 2: tmp[0] = src_r0 << 16;
758 tmp[1] = src_r0 >> 16;
759 break;
760 case 3: tmp[0] = src_r0 << 24;
761 tmp[1] = src_r0 >> 8;
762 break;
763 }
764
765 switch (offset / 4)
766 {
767 case 0: dst0[0] |= tmp[0];
768 dst0[1] = tmp[1];
769 break;
770 case 1: dst0[1] |= tmp[0];
771 dst0[2] = tmp[1];
772 break;
773 case 2: dst0[2] |= tmp[0];
774 dst0[3] = tmp[1];
775 break;
776 case 3: dst0[3] |= tmp[0];
777 dst1[0] = tmp[1];
778 break;
779 case 4: dst1[0] |= tmp[0];
780 dst1[1] = tmp[1];
781 break;
782 case 5: dst1[1] |= tmp[0];
783 dst1[2] = tmp[1];
784 break;
785 case 6: dst1[2] |= tmp[0];
786 dst1[3] = tmp[1];
787 break;
788 case 7: dst1[3] |= tmp[0];
789 break;
790 }
791 }
792
793 static void append_block8 (const uint offset, uint32_t dst0[4], uint32_t dst1[4], const uint32_t src_l0[4], const uint32_t src_l1[4], const uint32_t src_r0[4], const uint32_t src_r1[4])
794 {
795 switch (offset)
796 {
797 case 0:
798 dst0[0] = src_r0[0];
799 dst0[1] = src_r0[1];
800 dst0[2] = src_r0[2];
801 dst0[3] = src_r0[3];
802 dst1[0] = src_r1[0];
803 dst1[1] = src_r1[1];
804 dst1[2] = src_r1[2];
805 dst1[3] = src_r1[3];
806 break;
807
808 case 1:
809 dst0[0] = src_l0[0] | src_r0[0] << 8;
810 dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8;
811 dst0[2] = src_r0[1] >> 24 | src_r0[2] << 8;
812 dst0[3] = src_r0[2] >> 24 | src_r0[3] << 8;
813 dst1[0] = src_r0[3] >> 24 | src_r1[0] << 8;
814 dst1[1] = src_r1[0] >> 24 | src_r1[1] << 8;
815 dst1[2] = src_r1[1] >> 24 | src_r1[2] << 8;
816 dst1[3] = src_r1[2] >> 24 | src_r1[3] << 8;
817 break;
818
819 case 2:
820 dst0[0] = src_l0[0] | src_r0[0] << 16;
821 dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16;
822 dst0[2] = src_r0[1] >> 16 | src_r0[2] << 16;
823 dst0[3] = src_r0[2] >> 16 | src_r0[3] << 16;
824 dst1[0] = src_r0[3] >> 16 | src_r1[0] << 16;
825 dst1[1] = src_r1[0] >> 16 | src_r1[1] << 16;
826 dst1[2] = src_r1[1] >> 16 | src_r1[2] << 16;
827 dst1[3] = src_r1[2] >> 16 | src_r1[3] << 16;
828 break;
829
830 case 3:
831 dst0[0] = src_l0[0] | src_r0[0] << 24;
832 dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24;
833 dst0[2] = src_r0[1] >> 8 | src_r0[2] << 24;
834 dst0[3] = src_r0[2] >> 8 | src_r0[3] << 24;
835 dst1[0] = src_r0[3] >> 8 | src_r1[0] << 24;
836 dst1[1] = src_r1[0] >> 8 | src_r1[1] << 24;
837 dst1[2] = src_r1[1] >> 8 | src_r1[2] << 24;
838 dst1[3] = src_r1[2] >> 8 | src_r1[3] << 24;
839 break;
840
841 case 4:
842 dst0[1] = src_r0[0];
843 dst0[2] = src_r0[1];
844 dst0[3] = src_r0[2];
845 dst1[0] = src_r0[3];
846 dst1[1] = src_r1[0];
847 dst1[2] = src_r1[1];
848 dst1[3] = src_r1[2];
849 break;
850
851 case 5:
852 dst0[1] = src_l0[1] | src_r0[0] << 8;
853 dst0[2] = src_r0[0] >> 24 | src_r0[1] << 8;
854 dst0[3] = src_r0[1] >> 24 | src_r0[2] << 8;
855 dst1[0] = src_r0[2] >> 24 | src_r0[3] << 8;
856 dst1[1] = src_r0[3] >> 24 | src_r1[0] << 8;
857 dst1[2] = src_r1[0] >> 24 | src_r1[1] << 8;
858 dst1[3] = src_r1[1] >> 24 | src_r1[2] << 8;
859 break;
860
861 case 6:
862 dst0[1] = src_l0[1] | src_r0[0] << 16;
863 dst0[2] = src_r0[0] >> 16 | src_r0[1] << 16;
864 dst0[3] = src_r0[1] >> 16 | src_r0[2] << 16;
865 dst1[0] = src_r0[2] >> 16 | src_r0[3] << 16;
866 dst1[1] = src_r0[3] >> 16 | src_r1[0] << 16;
867 dst1[2] = src_r1[0] >> 16 | src_r1[1] << 16;
868 dst1[3] = src_r1[1] >> 16 | src_r1[2] << 16;
869 break;
870
871 case 7:
872 dst0[1] = src_l0[1] | src_r0[0] << 24;
873 dst0[2] = src_r0[0] >> 8 | src_r0[1] << 24;
874 dst0[3] = src_r0[1] >> 8 | src_r0[2] << 24;
875 dst1[0] = src_r0[2] >> 8 | src_r0[3] << 24;
876 dst1[1] = src_r0[3] >> 8 | src_r1[0] << 24;
877 dst1[2] = src_r1[0] >> 8 | src_r1[1] << 24;
878 dst1[3] = src_r1[1] >> 8 | src_r1[2] << 24;
879 break;
880
881 case 8:
882 dst0[2] = src_r0[0];
883 dst0[3] = src_r0[1];
884 dst1[0] = src_r0[2];
885 dst1[1] = src_r0[3];
886 dst1[2] = src_r1[0];
887 dst1[3] = src_r1[1];
888 break;
889
890 case 9:
891 dst0[2] = src_l0[2] | src_r0[0] << 8;
892 dst0[3] = src_r0[0] >> 24 | src_r0[1] << 8;
893 dst1[0] = src_r0[1] >> 24 | src_r0[2] << 8;
894 dst1[1] = src_r0[2] >> 24 | src_r0[3] << 8;
895 dst1[2] = src_r0[3] >> 24 | src_r1[0] << 8;
896 dst1[3] = src_r1[0] >> 24 | src_r1[1] << 8;
897 break;
898
899 case 10:
900 dst0[2] = src_l0[2] | src_r0[0] << 16;
901 dst0[3] = src_r0[0] >> 16 | src_r0[1] << 16;
902 dst1[0] = src_r0[1] >> 16 | src_r0[2] << 16;
903 dst1[1] = src_r0[2] >> 16 | src_r0[3] << 16;
904 dst1[2] = src_r0[3] >> 16 | src_r1[0] << 16;
905 dst1[3] = src_r1[0] >> 16 | src_r1[1] << 16;
906 break;
907
908 case 11:
909 dst0[2] = src_l0[2] | src_r0[0] << 24;
910 dst0[3] = src_r0[0] >> 8 | src_r0[1] << 24;
911 dst1[0] = src_r0[1] >> 8 | src_r0[2] << 24;
912 dst1[1] = src_r0[2] >> 8 | src_r0[3] << 24;
913 dst1[2] = src_r0[3] >> 8 | src_r1[0] << 24;
914 dst1[3] = src_r1[0] >> 8 | src_r1[1] << 24;
915 break;
916
917 case 12:
918 dst0[3] = src_r0[0];
919 dst1[0] = src_r0[1];
920 dst1[1] = src_r0[2];
921 dst1[2] = src_r0[3];
922 dst1[3] = src_r1[0];
923 break;
924
925 case 13:
926 dst0[3] = src_l0[3] | src_r0[0] << 8;
927 dst1[0] = src_r0[0] >> 24 | src_r0[1] << 8;
928 dst1[1] = src_r0[1] >> 24 | src_r0[2] << 8;
929 dst1[2] = src_r0[2] >> 24 | src_r0[3] << 8;
930 dst1[3] = src_r0[3] >> 24 | src_r1[0] << 8;
931 break;
932
933 case 14:
934 dst0[3] = src_l0[3] | src_r0[0] << 16;
935 dst1[0] = src_r0[0] >> 16 | src_r0[1] << 16;
936 dst1[1] = src_r0[1] >> 16 | src_r0[2] << 16;
937 dst1[2] = src_r0[2] >> 16 | src_r0[3] << 16;
938 dst1[3] = src_r0[3] >> 16 | src_r1[0] << 16;
939 break;
940
941 case 15:
942 dst0[3] = src_l0[3] | src_r0[0] << 24;
943 dst1[0] = src_r0[0] >> 8 | src_r0[1] << 24;
944 dst1[1] = src_r0[1] >> 8 | src_r0[2] << 24;
945 dst1[2] = src_r0[2] >> 8 | src_r0[3] << 24;
946 dst1[3] = src_r0[3] >> 8 | src_r1[0] << 24;
947 break;
948
949 case 16:
950 dst1[0] = src_r0[0];
951 dst1[1] = src_r0[1];
952 dst1[2] = src_r0[2];
953 dst1[3] = src_r0[3];
954 break;
955
956 case 17:
957 dst1[0] = src_l1[0] | src_r0[0] << 8;
958 dst1[1] = src_r0[0] >> 24 | src_r0[1] << 8;
959 dst1[2] = src_r0[1] >> 24 | src_r0[2] << 8;
960 dst1[3] = src_r0[2] >> 24 | src_r0[3] << 8;
961 break;
962
963 case 18:
964 dst1[0] = src_l1[0] | src_r0[0] << 16;
965 dst1[1] = src_r0[0] >> 16 | src_r0[1] << 16;
966 dst1[2] = src_r0[1] >> 16 | src_r0[2] << 16;
967 dst1[3] = src_r0[2] >> 16 | src_r0[3] << 16;
968 break;
969
970 case 19:
971 dst1[0] = src_l1[0] | src_r0[0] << 24;
972 dst1[1] = src_r0[0] >> 8 | src_r0[1] << 24;
973 dst1[2] = src_r0[1] >> 8 | src_r0[2] << 24;
974 dst1[3] = src_r0[2] >> 8 | src_r0[3] << 24;
975 break;
976
977 case 20:
978 dst1[1] = src_r0[0];
979 dst1[2] = src_r0[1];
980 dst1[3] = src_r0[2];
981 break;
982
983 case 21:
984 dst1[1] = src_l1[1] | src_r0[0] << 8;
985 dst1[2] = src_r0[0] >> 24 | src_r0[1] << 8;
986 dst1[3] = src_r0[1] >> 24 | src_r0[2] << 8;
987 break;
988
989 case 22:
990 dst1[1] = src_l1[1] | src_r0[0] << 16;
991 dst1[2] = src_r0[0] >> 16 | src_r0[1] << 16;
992 dst1[3] = src_r0[1] >> 16 | src_r0[2] << 16;
993 break;
994
995 case 23:
996 dst1[1] = src_l1[1] | src_r0[0] << 24;
997 dst1[2] = src_r0[0] >> 8 | src_r0[1] << 24;
998 dst1[3] = src_r0[1] >> 8 | src_r0[2] << 24;
999 break;
1000
1001 case 24:
1002 dst1[2] = src_r0[0];
1003 dst1[3] = src_r0[1];
1004 break;
1005
1006 case 25:
1007 dst1[2] = src_l1[2] | src_r0[0] << 8;
1008 dst1[3] = src_r0[0] >> 24 | src_r0[1] << 8;
1009 break;
1010
1011 case 26:
1012 dst1[2] = src_l1[2] | src_r0[0] << 16;
1013 dst1[3] = src_r0[0] >> 16 | src_r0[1] << 16;
1014 break;
1015
1016 case 27:
1017 dst1[2] = src_l1[2] | src_r0[0] << 24;
1018 dst1[3] = src_r0[0] >> 8 | src_r0[1] << 24;
1019 break;
1020
1021 case 28:
1022 dst1[3] = src_r0[0];
1023 break;
1024
1025 case 29:
1026 dst1[3] = src_l1[3] | src_r0[0] << 8;
1027 break;
1028
1029 case 30:
1030 dst1[3] = src_l1[3] | src_r0[0] << 16;
1031 break;
1032
1033 case 31:
1034 dst1[3] = src_l1[3] | src_r0[0] << 24;
1035 break;
1036 }
1037 }
1038
1039 static void reverse_block (uint32_t in0[4], uint32_t in1[4], uint32_t out0[4], uint32_t out1[4], const uint len)
1040 {
1041 rshift_block_N (in0, in1, out0, out1, 32 - len);
1042
1043 uint32_t tib40[4];
1044 uint32_t tib41[4];
1045
1046 tib40[0] = out1[3];
1047 tib40[1] = out1[2];
1048 tib40[2] = out1[1];
1049 tib40[3] = out1[0];
1050 tib41[0] = out0[3];
1051 tib41[1] = out0[2];
1052 tib41[2] = out0[1];
1053 tib41[3] = out0[0];
1054
1055 out0[0] = swap_workaround (tib40[0]);
1056 out0[1] = swap_workaround (tib40[1]);
1057 out0[2] = swap_workaround (tib40[2]);
1058 out0[3] = swap_workaround (tib40[3]);
1059 out1[0] = swap_workaround (tib41[0]);
1060 out1[1] = swap_workaround (tib41[1]);
1061 out1[2] = swap_workaround (tib41[2]);
1062 out1[3] = swap_workaround (tib41[3]);
1063 }
1064
1065 static uint rule_op_mangle_lrest (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
1066 {
1067 buf0[0] |= (generate_cmask (buf0[0]));
1068 buf0[1] |= (generate_cmask (buf0[1]));
1069 buf0[2] |= (generate_cmask (buf0[2]));
1070 buf0[3] |= (generate_cmask (buf0[3]));
1071 buf1[0] |= (generate_cmask (buf1[0]));
1072 buf1[1] |= (generate_cmask (buf1[1]));
1073 buf1[2] |= (generate_cmask (buf1[2]));
1074 buf1[3] |= (generate_cmask (buf1[3]));
1075
1076 return in_len;
1077 }
1078
1079 static uint rule_op_mangle_urest (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
1080 {
1081 buf0[0] &= ~(generate_cmask (buf0[0]));
1082 buf0[1] &= ~(generate_cmask (buf0[1]));
1083 buf0[2] &= ~(generate_cmask (buf0[2]));
1084 buf0[3] &= ~(generate_cmask (buf0[3]));
1085 buf1[0] &= ~(generate_cmask (buf1[0]));
1086 buf1[1] &= ~(generate_cmask (buf1[1]));
1087 buf1[2] &= ~(generate_cmask (buf1[2]));
1088 buf1[3] &= ~(generate_cmask (buf1[3]));
1089
1090 return in_len;
1091 }
1092
1093 static uint rule_op_mangle_lrest_ufirst (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
1094 {
1095 rule_op_mangle_lrest (p0, p1, buf0, buf1, in_len);
1096
1097 buf0[0] &= ~(0x00000020 & generate_cmask (buf0[0]));
1098
1099 return in_len;
1100 }
1101
1102 static uint rule_op_mangle_urest_lfirst (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
1103 {
1104 rule_op_mangle_urest (p0, p1, buf0, buf1, in_len);
1105
1106 buf0[0] |= (0x00000020 & generate_cmask (buf0[0]));
1107
1108 return in_len;
1109 }
1110
1111 static uint rule_op_mangle_trest (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
1112 {
1113 buf0[0] ^= (generate_cmask (buf0[0]));
1114 buf0[1] ^= (generate_cmask (buf0[1]));
1115 buf0[2] ^= (generate_cmask (buf0[2]));
1116 buf0[3] ^= (generate_cmask (buf0[3]));
1117 buf1[0] ^= (generate_cmask (buf1[0]));
1118 buf1[1] ^= (generate_cmask (buf1[1]));
1119 buf1[2] ^= (generate_cmask (buf1[2]));
1120 buf1[3] ^= (generate_cmask (buf1[3]));
1121
1122 return in_len;
1123 }
1124
1125 static uint rule_op_mangle_toggle_at (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
1126 {
1127 if (p0 >= in_len) return (in_len);
1128
1129 const uint tmp = 0x20 << ((p0 & 3) * 8);
1130
1131 switch (p0 / 4)
1132 {
1133 case 0: buf0[0] ^= (tmp & generate_cmask (buf0[0])); break;
1134 case 1: buf0[1] ^= (tmp & generate_cmask (buf0[1])); break;
1135 case 2: buf0[2] ^= (tmp & generate_cmask (buf0[2])); break;
1136 case 3: buf0[3] ^= (tmp & generate_cmask (buf0[3])); break;
1137 case 4: buf1[0] ^= (tmp & generate_cmask (buf1[0])); break;
1138 case 5: buf1[1] ^= (tmp & generate_cmask (buf1[1])); break;
1139 case 6: buf1[2] ^= (tmp & generate_cmask (buf1[2])); break;
1140 case 7: buf1[3] ^= (tmp & generate_cmask (buf1[3])); break;
1141 }
1142
1143 return in_len;
1144 }
1145
1146 static uint rule_op_mangle_reverse (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
1147 {
1148 reverse_block (buf0, buf1, buf0, buf1, in_len);
1149
1150 return in_len;
1151 }
1152
1153 static uint rule_op_mangle_dupeword (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
1154 {
1155 if ((in_len + in_len) >= 32) return (in_len);
1156
1157 uint out_len = in_len;
1158
1159 uint32_t tib40[4];
1160 uint32_t tib41[4];
1161
1162 tib40[0] = buf0[0];
1163 tib40[1] = buf0[1];
1164 tib40[2] = buf0[2];
1165 tib40[3] = buf0[3];
1166 tib41[0] = buf1[0];
1167 tib41[1] = buf1[1];
1168 tib41[2] = buf1[2];
1169 tib41[3] = buf1[3];
1170
1171 append_block8 (out_len, buf0, buf1, buf0, buf1, tib40, tib41);
1172
1173 out_len += in_len;
1174
1175 return out_len;
1176 }
1177
1178 static uint rule_op_mangle_dupeword_times (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
1179 {
1180 if (((in_len * p0) + in_len) >= 32) return (in_len);
1181
1182 uint out_len = in_len;
1183
1184 uint32_t tib40[4];
1185 uint32_t tib41[4];
1186
1187 tib40[0] = buf0[0];
1188 tib40[1] = buf0[1];
1189 tib40[2] = buf0[2];
1190 tib40[3] = buf0[3];
1191 tib41[0] = buf1[0];
1192 tib41[1] = buf1[1];
1193 tib41[2] = buf1[2];
1194 tib41[3] = buf1[3];
1195
1196 for (uint i = 0; i < p0; i++)
1197 {
1198 append_block8 (out_len, buf0, buf1, buf0, buf1, tib40, tib41);
1199
1200 out_len += in_len;
1201 }
1202
1203 return out_len;
1204 }
1205
1206 static uint rule_op_mangle_reflect (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
1207 {
1208 if ((in_len + in_len) >= 32) return (in_len);
1209
1210 uint out_len = in_len;
1211
1212 uint32_t tib40[4];
1213 uint32_t tib41[4];
1214
1215 reverse_block (buf0, buf1, tib40, tib41, out_len);
1216
1217 append_block8 (out_len, buf0, buf1, buf0, buf1, tib40, tib41);
1218
1219 out_len += in_len;
1220
1221 return out_len;
1222 }
1223
1224 static uint rule_op_mangle_append (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
1225 {
1226 if ((in_len + 1) >= 32) return (in_len);
1227
1228 uint out_len = in_len;
1229
1230 append_block1 (out_len, buf0, buf1, p0);
1231
1232 out_len++;
1233
1234 return out_len;
1235 }
1236
1237 static uint rule_op_mangle_prepend (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
1238 {
1239 if ((in_len + 1) >= 32) return (in_len);
1240
1241 uint out_len = in_len;
1242
1243 rshift_block (buf0, buf1, buf0, buf1);
1244
1245 buf0[0] = buf0[0] | p0;
1246
1247 out_len++;
1248
1249 return out_len;
1250 }
1251
1252 static uint rule_op_mangle_rotate_left (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
1253 {
1254 if (in_len == 0) return (in_len);
1255
1256 const uint in_len1 = in_len - 1;
1257
1258 const uint sh = (in_len1 & 3) * 8;
1259
1260 const uint32_t tmp = (buf0[0] & 0xff) << sh;
1261
1262 lshift_block (buf0, buf1, buf0, buf1);
1263
1264 switch (in_len1 / 4)
1265 {
1266 case 0: buf0[0] |= tmp; break;
1267 case 1: buf0[1] |= tmp; break;
1268 case 2: buf0[2] |= tmp; break;
1269 case 3: buf0[3] |= tmp; break;
1270 case 4: buf1[0] |= tmp; break;
1271 case 5: buf1[1] |= tmp; break;
1272 case 6: buf1[2] |= tmp; break;
1273 case 7: buf1[3] |= tmp; break;
1274 }
1275
1276 return in_len;
1277 }
1278
1279 static uint rule_op_mangle_rotate_right (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
1280 {
1281 if (in_len == 0) return (in_len);
1282
1283 const uint in_len1 = in_len - 1;
1284
1285 const uint sh = (in_len1 & 3) * 8;
1286
1287 uint32_t tmp = 0;
1288
1289 switch (in_len1 / 4)
1290 {
1291 case 0: tmp = (buf0[0] >> sh) & 0xff; break;
1292 case 1: tmp = (buf0[1] >> sh) & 0xff; break;
1293 case 2: tmp = (buf0[2] >> sh) & 0xff; break;
1294 case 3: tmp = (buf0[3] >> sh) & 0xff; break;
1295 case 4: tmp = (buf1[0] >> sh) & 0xff; break;
1296 case 5: tmp = (buf1[1] >> sh) & 0xff; break;
1297 case 6: tmp = (buf1[2] >> sh) & 0xff; break;
1298 case 7: tmp = (buf1[3] >> sh) & 0xff; break;
1299 }
1300
1301 rshift_block (buf0, buf1, buf0, buf1);
1302
1303 buf0[0] |= tmp;
1304
1305 truncate_right (buf0, buf1, in_len);
1306
1307 return in_len;
1308 }
1309
1310 static uint rule_op_mangle_delete_first (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
1311 {
1312 if (in_len == 0) return (in_len);
1313
1314 const uint in_len1 = in_len - 1;
1315
1316 lshift_block (buf0, buf1, buf0, buf1);
1317
1318 return in_len1;
1319 }
1320
1321 static uint rule_op_mangle_delete_last (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
1322 {
1323 if (in_len == 0) return (in_len);
1324
1325 const uint in_len1 = in_len - 1;
1326
1327 const uint tmp = (1 << ((in_len1 & 3) * 8)) - 1;
1328
1329 switch (in_len1 / 4)
1330 {
1331 case 0: buf0[0] &= tmp; break;
1332 case 1: buf0[1] &= tmp; break;
1333 case 2: buf0[2] &= tmp; break;
1334 case 3: buf0[3] &= tmp; break;
1335 case 4: buf1[0] &= tmp; break;
1336 case 5: buf1[1] &= tmp; break;
1337 case 6: buf1[2] &= tmp; break;
1338 case 7: buf1[3] &= tmp; break;
1339 }
1340
1341 return in_len1;
1342 }
1343
1344 static uint rule_op_mangle_delete_at (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
1345 {
1346 if (p0 >= in_len) return (in_len);
1347
1348 uint out_len = in_len;
1349
1350 uint32_t tib40[4];
1351 uint32_t tib41[4];
1352
1353 lshift_block (buf0, buf1, tib40, tib41);
1354
1355 const uint ml = (1 << ((p0 & 3) * 8)) - 1;
1356 const uint mr = ~ml;
1357
1358 switch (p0 / 4)
1359 {
1360 case 0: buf0[0] = (buf0[0] & ml)
1361 | (tib40[0] & mr);
1362 buf0[1] = tib40[1];
1363 buf0[2] = tib40[2];
1364 buf0[3] = tib40[3];
1365 buf1[0] = tib41[0];
1366 buf1[1] = tib41[1];
1367 buf1[2] = tib41[2];
1368 buf1[3] = tib41[3];
1369 break;
1370 case 1: buf0[1] = (buf0[1] & ml)
1371 | (tib40[1] & mr);
1372 buf0[2] = tib40[2];
1373 buf0[3] = tib40[3];
1374 buf1[0] = tib41[0];
1375 buf1[1] = tib41[1];
1376 buf1[2] = tib41[2];
1377 buf1[3] = tib41[3];
1378 break;
1379 case 2: buf0[2] = (buf0[2] & ml)
1380 | (tib40[2] & mr);
1381 buf0[3] = tib40[3];
1382 buf1[0] = tib41[0];
1383 buf1[1] = tib41[1];
1384 buf1[2] = tib41[2];
1385 buf1[3] = tib41[3];
1386 break;
1387 case 3: buf0[3] = (buf0[3] & ml)
1388 | (tib40[3] & mr);
1389 buf1[0] = tib41[0];
1390 buf1[1] = tib41[1];
1391 buf1[2] = tib41[2];
1392 buf1[3] = tib41[3];
1393 break;
1394 case 4: buf1[0] = (buf1[0] & ml)
1395 | (tib41[0] & mr);
1396 buf1[1] = tib41[1];
1397 buf1[2] = tib41[2];
1398 buf1[3] = tib41[3];
1399 break;
1400 case 5: buf1[1] = (buf1[1] & ml)
1401 | (tib41[1] & mr);
1402 buf1[2] = tib41[2];
1403 buf1[3] = tib41[3];
1404 break;
1405 case 6: buf1[2] = (buf1[2] & ml)
1406 | (tib41[2] & mr);
1407 buf1[3] = tib41[3];
1408 break;
1409 case 7: buf1[3] = (buf1[3] & ml)
1410 | (tib41[3] & mr);
1411 break;
1412 }
1413
1414 out_len--;
1415
1416 return out_len;
1417 }
1418
1419 static uint rule_op_mangle_extract (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
1420 {
1421 if (p0 >= in_len) return (in_len);
1422
1423 if ((p0 + p1) > in_len) return (in_len);
1424
1425 uint out_len = p1;
1426
1427 lshift_block_N (buf0, buf1, buf0, buf1, p0);
1428
1429 truncate_right (buf0, buf1, out_len);
1430
1431 return out_len;
1432 }
1433
1434 static uint rule_op_mangle_omit (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
1435 {
1436 if (p0 >= in_len) return (in_len);
1437
1438 if ((p0 + p1) > in_len) return (in_len);
1439
1440 uint out_len = in_len;
1441
1442 uint32_t tib40[4];
1443 uint32_t tib41[4];
1444
1445 tib40[0] = 0;
1446 tib40[1] = 0;
1447 tib40[2] = 0;
1448 tib40[3] = 0;
1449 tib41[0] = 0;
1450 tib41[1] = 0;
1451 tib41[2] = 0;
1452 tib41[3] = 0;
1453
1454 lshift_block_N (buf0, buf1, tib40, tib41, p1);
1455
1456 const uint ml = (1 << ((p0 & 3) * 8)) - 1;
1457 const uint mr = ~ml;
1458
1459 switch (p0 / 4)
1460 {
1461 case 0: buf0[0] = (buf0[0] & ml)
1462 | (tib40[0] & mr);
1463 buf0[1] = tib40[1];
1464 buf0[2] = tib40[2];
1465 buf0[3] = tib40[3];
1466 buf1[0] = tib41[0];
1467 buf1[1] = tib41[1];
1468 buf1[2] = tib41[2];
1469 buf1[3] = tib41[3];
1470 break;
1471 case 1: buf0[1] = (buf0[1] & ml)
1472 | (tib40[1] & mr);
1473 buf0[2] = tib40[2];
1474 buf0[3] = tib40[3];
1475 buf1[0] = tib41[0];
1476 buf1[1] = tib41[1];
1477 buf1[2] = tib41[2];
1478 buf1[3] = tib41[3];
1479 break;
1480 case 2: buf0[2] = (buf0[2] & ml)
1481 | (tib40[2] & mr);
1482 buf0[3] = tib40[3];
1483 buf1[0] = tib41[0];
1484 buf1[1] = tib41[1];
1485 buf1[2] = tib41[2];
1486 buf1[3] = tib41[3];
1487 break;
1488 case 3: buf0[3] = (buf0[3] & ml)
1489 | (tib40[3] & mr);
1490 buf1[0] = tib41[0];
1491 buf1[1] = tib41[1];
1492 buf1[2] = tib41[2];
1493 buf1[3] = tib41[3];
1494 break;
1495 case 4: buf1[0] = (buf1[0] & ml)
1496 | (tib41[0] & mr);
1497 buf1[1] = tib41[1];
1498 buf1[2] = tib41[2];
1499 buf1[3] = tib41[3];
1500 break;
1501 case 5: buf1[1] = (buf1[1] & ml)
1502 | (tib41[1] & mr);
1503 buf1[2] = tib41[2];
1504 buf1[3] = tib41[3];
1505 break;
1506 case 6: buf1[2] = (buf1[2] & ml)
1507 | (tib41[2] & mr);
1508 buf1[3] = tib41[3];
1509 break;
1510 case 7: buf1[3] = (buf1[3] & ml)
1511 | (tib41[3] & mr);
1512 break;
1513 }
1514
1515 out_len -= p1;
1516
1517 return out_len;
1518 }
1519
1520 static uint rule_op_mangle_insert (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
1521 {
1522 if (p0 > in_len) return (in_len);
1523
1524 if ((in_len + 1) >= 32) return (in_len);
1525
1526 uint out_len = in_len;
1527
1528 uint32_t tib40[4];
1529 uint32_t tib41[4];
1530
1531 rshift_block (buf0, buf1, tib40, tib41);
1532
1533 const uint p1n = p1 << ((p0 & 3) * 8);
1534
1535 const uint ml = (1 << ((p0 & 3) * 8)) - 1;
1536
1537 const uint mr = 0xffffff00 << ((p0 & 3) * 8);
1538
1539 switch (p0 / 4)
1540 {
1541 case 0: buf0[0] = (buf0[0] & ml) | p1n | (tib40[0] & mr);
1542 buf0[1] = tib40[1];
1543 buf0[2] = tib40[2];
1544 buf0[3] = tib40[3];
1545 buf1[0] = tib41[0];
1546 buf1[1] = tib41[1];
1547 buf1[2] = tib41[2];
1548 buf1[3] = tib41[3];
1549 break;
1550 case 1: buf0[1] = (buf0[1] & ml) | p1n | (tib40[1] & mr);
1551 buf0[2] = tib40[2];
1552 buf0[3] = tib40[3];
1553 buf1[0] = tib41[0];
1554 buf1[1] = tib41[1];
1555 buf1[2] = tib41[2];
1556 buf1[3] = tib41[3];
1557 break;
1558 case 2: buf0[2] = (buf0[2] & ml) | p1n | (tib40[2] & mr);
1559 buf0[3] = tib40[3];
1560 buf1[0] = tib41[0];
1561 buf1[1] = tib41[1];
1562 buf1[2] = tib41[2];
1563 buf1[3] = tib41[3];
1564 break;
1565 case 3: buf0[3] = (buf0[3] & ml) | p1n | (tib40[3] & mr);
1566 buf1[0] = tib41[0];
1567 buf1[1] = tib41[1];
1568 buf1[2] = tib41[2];
1569 buf1[3] = tib41[3];
1570 break;
1571 case 4: buf1[0] = (buf1[0] & ml) | p1n | (tib41[0] & mr);
1572 buf1[1] = tib41[1];
1573 buf1[2] = tib41[2];
1574 buf1[3] = tib41[3];
1575 break;
1576 case 5: buf1[1] = (buf1[1] & ml) | p1n | (tib41[1] & mr);
1577 buf1[2] = tib41[2];
1578 buf1[3] = tib41[3];
1579 break;
1580 case 6: buf1[2] = (buf1[2] & ml) | p1n | (tib41[2] & mr);
1581 buf1[3] = tib41[3];
1582 break;
1583 case 7: buf1[3] = (buf1[3] & ml) | p1n | (tib41[3] & mr);
1584 break;
1585 }
1586
1587 out_len++;
1588
1589 return out_len;
1590 }
1591
1592 static uint rule_op_mangle_overstrike (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
1593 {
1594 if (p0 >= in_len) return (in_len);
1595
1596 const uint p1n = p1 << ((p0 & 3) * 8);
1597
1598 const uint m = ~(0xff << ((p0 & 3) * 8));
1599
1600 switch (p0 / 4)
1601 {
1602 case 0: buf0[0] = (buf0[0] & m) | p1n; break;
1603 case 1: buf0[1] = (buf0[1] & m) | p1n; break;
1604 case 2: buf0[2] = (buf0[2] & m) | p1n; break;
1605 case 3: buf0[3] = (buf0[3] & m) | p1n; break;
1606 case 4: buf1[0] = (buf1[0] & m) | p1n; break;
1607 case 5: buf1[1] = (buf1[1] & m) | p1n; break;
1608 case 6: buf1[2] = (buf1[2] & m) | p1n; break;
1609 case 7: buf1[3] = (buf1[3] & m) | p1n; break;
1610 }
1611
1612 return in_len;
1613 }
1614
1615 static uint rule_op_mangle_truncate_at (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
1616 {
1617 if (p0 >= in_len) return (in_len);
1618
1619 truncate_right (buf0, buf1, p0);
1620
1621 return p0;
1622 }
1623
1624 static uint rule_op_mangle_replace (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
1625 {
1626 for (uint i = 0; i < in_len; i++)
1627 {
1628 switch (i)
1629 {
1630 case 0: if (((buf0[0] >> 0) & 0xFF) == p0) buf0[0] = (buf0[0] & 0xFFFFFF00) | p1 << 0; break;
1631 case 1: if (((buf0[0] >> 8) & 0xFF) == p0) buf0[0] = (buf0[0] & 0xFFFF00FF) | p1 << 8; break;
1632 case 2: if (((buf0[0] >> 16) & 0xFF) == p0) buf0[0] = (buf0[0] & 0xFF00FFFF) | p1 << 16; break;
1633 case 3: if (((buf0[0] >> 24) & 0xFF) == p0) buf0[0] = (buf0[0] & 0x00FFFFFF) | p1 << 24; break;
1634 case 4: if (((buf0[1] >> 0) & 0xFF) == p0) buf0[1] = (buf0[1] & 0xFFFFFF00) | p1 << 0; break;
1635 case 5: if (((buf0[1] >> 8) & 0xFF) == p0) buf0[1] = (buf0[1] & 0xFFFF00FF) | p1 << 8; break;
1636 case 6: if (((buf0[1] >> 16) & 0xFF) == p0) buf0[1] = (buf0[1] & 0xFF00FFFF) | p1 << 16; break;
1637 case 7: if (((buf0[1] >> 24) & 0xFF) == p0) buf0[1] = (buf0[1] & 0x00FFFFFF) | p1 << 24; break;
1638 case 8: if (((buf0[2] >> 0) & 0xFF) == p0) buf0[2] = (buf0[2] & 0xFFFFFF00) | p1 << 0; break;
1639 case 9: if (((buf0[2] >> 8) & 0xFF) == p0) buf0[2] = (buf0[2] & 0xFFFF00FF) | p1 << 8; break;
1640 case 10: if (((buf0[2] >> 16) & 0xFF) == p0) buf0[2] = (buf0[2] & 0xFF00FFFF) | p1 << 16; break;
1641 case 11: if (((buf0[2] >> 24) & 0xFF) == p0) buf0[2] = (buf0[2] & 0x00FFFFFF) | p1 << 24; break;
1642 case 12: if (((buf0[3] >> 0) & 0xFF) == p0) buf0[3] = (buf0[3] & 0xFFFFFF00) | p1 << 0; break;
1643 case 13: if (((buf0[3] >> 8) & 0xFF) == p0) buf0[3] = (buf0[3] & 0xFFFF00FF) | p1 << 8; break;
1644 case 14: if (((buf0[3] >> 16) & 0xFF) == p0) buf0[3] = (buf0[3] & 0xFF00FFFF) | p1 << 16; break;
1645 case 15: if (((buf0[3] >> 24) & 0xFF) == p0) buf0[3] = (buf0[3] & 0x00FFFFFF) | p1 << 24; break;
1646 case 16: if (((buf1[0] >> 0) & 0xFF) == p0) buf1[0] = (buf1[0] & 0xFFFFFF00) | p1 << 0; break;
1647 case 17: if (((buf1[0] >> 8) & 0xFF) == p0) buf1[0] = (buf1[0] & 0xFFFF00FF) | p1 << 8; break;
1648 case 18: if (((buf1[0] >> 16) & 0xFF) == p0) buf1[0] = (buf1[0] & 0xFF00FFFF) | p1 << 16; break;
1649 case 19: if (((buf1[0] >> 24) & 0xFF) == p0) buf1[0] = (buf1[0] & 0x00FFFFFF) | p1 << 24; break;
1650 case 20: if (((buf1[1] >> 0) & 0xFF) == p0) buf1[1] = (buf1[1] & 0xFFFFFF00) | p1 << 0; break;
1651 case 21: if (((buf1[1] >> 8) & 0xFF) == p0) buf1[1] = (buf1[1] & 0xFFFF00FF) | p1 << 8; break;
1652 case 22: if (((buf1[1] >> 16) & 0xFF) == p0) buf1[1] = (buf1[1] & 0xFF00FFFF) | p1 << 16; break;
1653 case 23: if (((buf1[1] >> 24) & 0xFF) == p0) buf1[1] = (buf1[1] & 0x00FFFFFF) | p1 << 24; break;
1654 case 24: if (((buf1[2] >> 0) & 0xFF) == p0) buf1[2] = (buf1[2] & 0xFFFFFF00) | p1 << 0; break;
1655 case 25: if (((buf1[2] >> 8) & 0xFF) == p0) buf1[2] = (buf1[2] & 0xFFFF00FF) | p1 << 8; break;
1656 case 26: if (((buf1[2] >> 16) & 0xFF) == p0) buf1[2] = (buf1[2] & 0xFF00FFFF) | p1 << 16; break;
1657 case 27: if (((buf1[2] >> 24) & 0xFF) == p0) buf1[2] = (buf1[2] & 0x00FFFFFF) | p1 << 24; break;
1658 case 28: if (((buf1[3] >> 0) & 0xFF) == p0) buf1[3] = (buf1[3] & 0xFFFFFF00) | p1 << 0; break;
1659 case 29: if (((buf1[3] >> 8) & 0xFF) == p0) buf1[3] = (buf1[3] & 0xFFFF00FF) | p1 << 8; break;
1660 case 30: if (((buf1[3] >> 16) & 0xFF) == p0) buf1[3] = (buf1[3] & 0xFF00FFFF) | p1 << 16; break;
1661 case 31: if (((buf1[3] >> 24) & 0xFF) == p0) buf1[3] = (buf1[3] & 0x00FFFFFF) | p1 << 24; break;
1662 }
1663 }
1664
1665 return in_len;
1666 }
1667
1668 static uint rule_op_mangle_purgechar (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
1669 {
1670 // TODO
1671 return in_len;
1672 }
1673
1674 static uint rule_op_mangle_togglecase_rec (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
1675 {
1676 // TODO
1677 return in_len;
1678 }
1679
1680 static uint rule_op_mangle_dupechar_first (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
1681 {
1682 if ( in_len == 0) return (in_len);
1683 if ((in_len + p0) >= 32) return (in_len);
1684
1685 uint out_len = in_len;
1686
1687 const uint32_t 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 uint rule_op_mangle_dupechar_last (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
1868 {
1869 if ( in_len == 0) return (in_len);
1870 if ((in_len + p0) >= 32) return (in_len);
1871
1872 const uint in_len1 = in_len - 1;
1873
1874 const uint sh = (in_len1 & 3) * 8;
1875
1876 uint32_t 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 uint out_len = in_len;
1891
1892 for (uint 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 uint rule_op_mangle_dupechar_all (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
1903 {
1904 if ( in_len == 0) return (in_len);
1905 if ((in_len + in_len) >= 32) return (in_len);
1906
1907 uint out_len = in_len;
1908
1909 uint32_t tib40[4];
1910 uint32_t 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 uint rule_op_mangle_switch_first (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint 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 uint rule_op_mangle_switch_last (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint 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 uint rule_op_mangle_switch_at (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
2030 {
2031 if (p0 >= in_len) return (in_len);
2032 if (p1 >= in_len) return (in_len);
2033
2034 uint32_t tmp0 = 0;
2035 uint32_t 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 uint rule_op_mangle_chr_shiftl (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
2277 {
2278 if (p0 >= in_len) return (in_len);
2279
2280 const uint mr = 0xff << ((p0 & 3) * 8);
2281 const uint 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 uint rule_op_mangle_chr_shiftr (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
2299 {
2300 if (p0 >= in_len) return (in_len);
2301
2302 const uint mr = 0xff << ((p0 & 3) * 8);
2303 const uint 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 uint rule_op_mangle_chr_incr (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
2321 {
2322 if (p0 >= in_len) return (in_len);
2323
2324 const uint mr = 0xff << ((p0 & 3) * 8);
2325 const uint ml = ~mr;
2326
2327 const uint 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 uint rule_op_mangle_chr_decr (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
2345 {
2346 if (p0 >= in_len) return (in_len);
2347
2348 const uint mr = 0xff << ((p0 & 3) * 8);
2349 const uint ml = ~mr;
2350
2351 const uint 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 uint rule_op_mangle_replace_np1 (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
2369 {
2370 if ((p0 + 1) >= in_len) return (in_len);
2371
2372 uint32_t tib40[4];
2373 uint32_t tib41[4];
2374
2375 lshift_block (buf0, buf1, tib40, tib41);
2376
2377 const uint mr = 0xff << ((p0 & 3) * 8);
2378 const uint 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 uint rule_op_mangle_replace_nm1 (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
2396 {
2397 if (p0 == 0) return (in_len);
2398
2399 if (p0 >= in_len) return (in_len);
2400
2401 uint32_t tib40[4];
2402 uint32_t tib41[4];
2403
2404 rshift_block (buf0, buf1, tib40, tib41);
2405
2406 const uint mr = 0xff << ((p0 & 3) * 8);
2407 const uint 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 uint rule_op_mangle_dupeblock_first (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
2425 {
2426 if (p0 > in_len) return (in_len);
2427
2428 if ((in_len + p0) >= 32) return (in_len);
2429
2430 uint out_len = in_len;
2431
2432 uint32_t tib40[4];
2433 uint32_t 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 uint rule_op_mangle_dupeblock_last (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
2463 {
2464 if (p0 > in_len) return (in_len);
2465
2466 if ((in_len + p0) >= 32) return (in_len);
2467
2468 uint out_len = in_len;
2469
2470 uint32_t tib40[4];
2471 uint32_t 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 uint rule_op_mangle_title (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint 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 (uint i = 0; i < in_len; i++)
2505 {
2506 uint32_t tmp0 = 0;
2507 uint32_t 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 uint apply_rule (const uint name, const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len)
2613 {
2614 uint 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 uint apply_rules (uint *cmds, uint32_t buf0[4], uint32_t buf1[4], const uint len)
2664 {
2665 uint out_len = len;
2666
2667 for (; *cmds; cmds++)
2668 {
2669 const uint name = (*cmds >> 0) & 0xff;
2670 const uint p0 = (*cmds >> 8) & 0xff;
2671 const uint p1 = (*cmds >> 16) & 0xff;
2672
2673 out_len = apply_rule (name, p0, p1, buf0, buf1, out_len);
2674 }
2675
2676 return out_len;
2677 }